From 01fd984c165e5e7a48239874fd0445ac68e5ce2d Mon Sep 17 00:00:00 2001 From: Nikita Tkachenko <121111529+nikita-tkachenko-datadog@users.noreply.github.com> Date: Thu, 20 Jun 2024 10:49:44 +0200 Subject: [PATCH] Add more metrics and tags to CI Visibility telemetry (#7223) --- .../CiVisibilityRepoServices.java | 6 ++- .../civisibility/CiVisibilitySystem.java | 6 +-- .../trace/civisibility/ci/AppVeyorInfo.java | 6 +++ .../civisibility/ci/AwsCodePipelineInfo.java | 6 +++ .../civisibility/ci/AzurePipelinesInfo.java | 6 +++ .../trace/civisibility/ci/BitBucketInfo.java | 6 +++ .../trace/civisibility/ci/BitriseInfo.java | 6 +++ .../trace/civisibility/ci/BuddyInfo.java | 6 +++ .../trace/civisibility/ci/BuildkiteInfo.java | 6 +++ .../trace/civisibility/ci/CIProviderInfo.java | 5 +-- .../trace/civisibility/ci/CircleCIInfo.java | 6 +++ .../trace/civisibility/ci/CodefreshInfo.java | 6 +++ .../trace/civisibility/ci/GitLabInfo.java | 6 +++ .../civisibility/ci/GithubActionsInfo.java | 6 +++ .../trace/civisibility/ci/JenkinsInfo.java | 6 +++ .../trace/civisibility/ci/TeamcityInfo.java | 6 +++ .../trace/civisibility/ci/TravisInfo.java | 6 +++ .../trace/civisibility/ci/UnknownCIInfo.java | 5 ++- .../communication/TelemetryListener.java | 23 ++++++++-- .../domain/AbstractTestSession.java | 18 +++++--- .../buildsystem/BuildSystemSessionImpl.java | 5 ++- .../domain/headless/HeadlessTestSession.java | 5 ++- .../manualapi/ManualApiTestSession.java | 5 ++- .../civisibility/git/tree/GitClient.java | 7 ++- .../CiVisibilityInstrumentationTest.groovy | 7 +-- .../trace/api/config/CiVisibilityConfig.java | 2 + .../writer/ddintake/TelemetryListener.java | 16 ++++++- internal-api/build.gradle | 2 + .../main/java/datadog/trace/api/Config.java | 8 ++++ .../telemetry/CiVisibilityCountMetric.java | 36 ++++++++++----- .../CiVisibilityDistributionMetric.java | 6 ++- .../telemetry/tag/AutoInjected.java | 13 ++++++ .../civisibility/telemetry/tag/ExitCode.java | 1 + .../civisibility/telemetry/tag/Provider.java | 33 ++++++++++++++ .../telemetry/tag/RequestCompressed.java | 13 ++++++ .../telemetry/tag/ResponseCompressed.java | 13 ++++++ .../telemetry/tag/StatusCode.java | 45 +++++++++++++++++++ 37 files changed, 320 insertions(+), 44 deletions(-) create mode 100644 internal-api/src/main/java/datadog/trace/api/civisibility/telemetry/tag/AutoInjected.java create mode 100644 internal-api/src/main/java/datadog/trace/api/civisibility/telemetry/tag/Provider.java create mode 100644 internal-api/src/main/java/datadog/trace/api/civisibility/telemetry/tag/RequestCompressed.java create mode 100644 internal-api/src/main/java/datadog/trace/api/civisibility/telemetry/tag/ResponseCompressed.java create mode 100644 internal-api/src/main/java/datadog/trace/api/civisibility/telemetry/tag/StatusCode.java 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 0ea74131542..b1955b96772 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 @@ -4,6 +4,7 @@ import datadog.trace.api.Config; import datadog.trace.api.civisibility.config.ModuleExecutionSettings; import datadog.trace.api.civisibility.telemetry.CiVisibilityMetricCollector; +import datadog.trace.api.civisibility.telemetry.tag.Provider; import datadog.trace.api.git.GitInfoProvider; import datadog.trace.civisibility.ci.CIInfo; import datadog.trace.civisibility.ci.CIProviderInfo; @@ -45,8 +46,8 @@ public class CiVisibilityRepoServices { final String repoRoot; final String moduleName; + final Provider ciProvider; final Map ciTags; - final boolean supportedCiProvider; final GitDataUploader gitDataUploader; final RepoIndexProvider repoIndexProvider; @@ -56,11 +57,12 @@ public class CiVisibilityRepoServices { CiVisibilityRepoServices(CiVisibilityServices services, Path path) { CIProviderInfo ciProviderInfo = services.ciProviderInfoFactory.createCIProviderInfo(path); + ciProvider = ciProviderInfo.getProvider(); + CIInfo ciInfo = ciProviderInfo.buildCIInfo(); repoRoot = ciInfo.getCiWorkspace(); moduleName = getModuleName(services.config, path, ciInfo); ciTags = new CITagsProvider().getCiTags(ciInfo); - supportedCiProvider = ciProviderInfo.isSupportedCiProvider(); gitDataUploader = buildGitDataUploader( 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 05f50f8a9b0..ed140519987 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 @@ -210,7 +210,7 @@ private static BuildSystemSession.Factory buildSystemSessionFactory( repoServices.repoRoot, startCommand, startTime, - repoServices.supportedCiProvider, + repoServices.ciProvider, services.config, services.metricCollector, testModuleRegistry, @@ -262,7 +262,7 @@ private static TestFrameworkSession.Factory headlessTestFrameworkEssionFactory( return new HeadlessTestSession( projectName, startTime, - repoServices.supportedCiProvider, + repoServices.ciProvider, services.config, services.metricCollector, testDecorator, @@ -282,7 +282,7 @@ private static CIVisibility.SessionFactory manualApiSessionFactory( return new ManualApiTestSession( projectName, startTime, - repoServices.supportedCiProvider, + repoServices.ciProvider, services.config, services.metricCollector, testDecorator, diff --git a/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/ci/AppVeyorInfo.java b/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/ci/AppVeyorInfo.java index 5b98050f7a2..80315deb1d8 100644 --- a/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/ci/AppVeyorInfo.java +++ b/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/ci/AppVeyorInfo.java @@ -4,6 +4,7 @@ import static datadog.trace.api.git.GitUtils.normalizeTag; import static datadog.trace.civisibility.utils.FileUtils.expandTilde; +import datadog.trace.api.civisibility.telemetry.tag.Provider; import datadog.trace.api.git.CommitInfo; import datadog.trace.api.git.GitInfo; import datadog.trace.api.git.PersonInfo; @@ -112,4 +113,9 @@ private PersonInfo buildGitCommitAuthor() { System.getenv(APPVEYOR_REPO_COMMIT_AUTHOR_NAME), System.getenv(APPVEYOR_REPO_COMMIT_AUTHOR_EMAIL)); } + + @Override + public Provider getProvider() { + return Provider.APPVEYOR; + } } diff --git a/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/ci/AwsCodePipelineInfo.java b/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/ci/AwsCodePipelineInfo.java index 4a0a9d299e6..fcae8d11248 100644 --- a/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/ci/AwsCodePipelineInfo.java +++ b/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/ci/AwsCodePipelineInfo.java @@ -1,5 +1,6 @@ package datadog.trace.civisibility.ci; +import datadog.trace.api.civisibility.telemetry.tag.Provider; import datadog.trace.api.git.GitInfo; class AwsCodePipelineInfo implements CIProviderInfo { @@ -26,4 +27,9 @@ public CIInfo buildCIInfo() { AWS_CODEPIPELINE_ARN) .build(); } + + @Override + public Provider getProvider() { + return Provider.AWS; + } } diff --git a/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/ci/AzurePipelinesInfo.java b/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/ci/AzurePipelinesInfo.java index 7e2a454411a..65cabf1d603 100644 --- a/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/ci/AzurePipelinesInfo.java +++ b/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/ci/AzurePipelinesInfo.java @@ -6,6 +6,7 @@ import static datadog.trace.api.git.GitUtils.normalizeTag; import static datadog.trace.civisibility.utils.FileUtils.expandTilde; +import datadog.trace.api.civisibility.telemetry.tag.Provider; import datadog.trace.api.git.CommitInfo; import datadog.trace.api.git.GitInfo; import datadog.trace.api.git.PersonInfo; @@ -134,4 +135,9 @@ private PersonInfo buildGitCommitAuthor() { System.getenv(AZURE_BUILD_REQUESTED_FOR_ID), System.getenv(AZURE_BUILD_REQUESTED_FOR_EMAIL)); } + + @Override + public Provider getProvider() { + return Provider.AZP; + } } diff --git a/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/ci/BitBucketInfo.java b/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/ci/BitBucketInfo.java index 544ea1f951c..80c1e705dc5 100644 --- a/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/ci/BitBucketInfo.java +++ b/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/ci/BitBucketInfo.java @@ -5,6 +5,7 @@ import static datadog.trace.api.git.GitUtils.normalizeTag; import static datadog.trace.civisibility.utils.FileUtils.expandTilde; +import datadog.trace.api.civisibility.telemetry.tag.Provider; import datadog.trace.api.git.CommitInfo; import datadog.trace.api.git.GitInfo; import datadog.trace.util.Strings; @@ -75,4 +76,9 @@ private String buildPipelineId() { } return id; } + + @Override + public Provider getProvider() { + return Provider.BITBUCKET; + } } diff --git a/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/ci/BitriseInfo.java b/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/ci/BitriseInfo.java index 230ac389db1..7428fe5ff24 100644 --- a/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/ci/BitriseInfo.java +++ b/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/ci/BitriseInfo.java @@ -5,6 +5,7 @@ import static datadog.trace.api.git.GitUtils.normalizeTag; import static datadog.trace.civisibility.utils.FileUtils.expandTilde; +import datadog.trace.api.civisibility.telemetry.tag.Provider; import datadog.trace.api.git.CommitInfo; import datadog.trace.api.git.GitInfo; import datadog.trace.api.git.PersonInfo; @@ -65,4 +66,9 @@ private String buildGitCommit() { return System.getenv(BITRISE_GIT_COMMIT); } } + + @Override + public Provider getProvider() { + return Provider.BITRISE; + } } diff --git a/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/ci/BuddyInfo.java b/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/ci/BuddyInfo.java index 840618071b6..2315f806f2f 100644 --- a/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/ci/BuddyInfo.java +++ b/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/ci/BuddyInfo.java @@ -4,6 +4,7 @@ import static datadog.trace.api.git.GitUtils.normalizeBranch; import static datadog.trace.api.git.GitUtils.normalizeTag; +import datadog.trace.api.civisibility.telemetry.tag.Provider; import datadog.trace.api.git.CommitInfo; import datadog.trace.api.git.GitInfo; import datadog.trace.api.git.PersonInfo; @@ -65,4 +66,9 @@ private PersonInfo buildGitCommiter() { return new PersonInfo( System.getenv(BUDDY_GIT_COMMIT_AUTHOR), System.getenv(BUDDY_GIT_COMMIT_EMAIL)); } + + @Override + public Provider getProvider() { + return Provider.BUDDYCI; + } } diff --git a/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/ci/BuildkiteInfo.java b/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/ci/BuildkiteInfo.java index 86bd3b5d5d4..72ba40ee611 100644 --- a/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/ci/BuildkiteInfo.java +++ b/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/ci/BuildkiteInfo.java @@ -6,6 +6,7 @@ import static datadog.trace.civisibility.utils.FileUtils.expandTilde; import static datadog.trace.util.Strings.toJson; +import datadog.trace.api.civisibility.telemetry.tag.Provider; import datadog.trace.api.git.CommitInfo; import datadog.trace.api.git.GitInfo; import datadog.trace.api.git.PersonInfo; @@ -84,4 +85,9 @@ private PersonInfo buildGitCommitAuthor() { return new PersonInfo( System.getenv(BUILDKITE_GIT_AUTHOR_NAME), System.getenv(BUILDKITE_GIT_AUTHOR_EMAIL)); } + + @Override + public Provider getProvider() { + return Provider.BUILDKITE; + } } diff --git a/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/ci/CIProviderInfo.java b/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/ci/CIProviderInfo.java index 4e276979e8b..5c189dfe5d5 100644 --- a/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/ci/CIProviderInfo.java +++ b/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/ci/CIProviderInfo.java @@ -1,5 +1,6 @@ package datadog.trace.civisibility.ci; +import datadog.trace.api.civisibility.telemetry.tag.Provider; import datadog.trace.api.git.GitInfo; public interface CIProviderInfo { @@ -8,7 +9,5 @@ public interface CIProviderInfo { CIInfo buildCIInfo(); - default boolean isSupportedCiProvider() { - return true; - } + Provider getProvider(); } diff --git a/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/ci/CircleCIInfo.java b/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/ci/CircleCIInfo.java index cf3234ac9ae..690bcac6f38 100644 --- a/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/ci/CircleCIInfo.java +++ b/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/ci/CircleCIInfo.java @@ -5,6 +5,7 @@ import static datadog.trace.api.git.GitUtils.normalizeTag; import static datadog.trace.civisibility.utils.FileUtils.expandTilde; +import datadog.trace.api.civisibility.telemetry.tag.Provider; import datadog.trace.api.git.CommitInfo; import datadog.trace.api.git.GitInfo; @@ -55,4 +56,9 @@ private String buildPipelineUrl(final String pipelineId) { return String.format("https://app.circleci.com/pipelines/workflows/%s", pipelineId); } + + @Override + public Provider getProvider() { + return Provider.CIRCLECI; + } } diff --git a/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/ci/CodefreshInfo.java b/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/ci/CodefreshInfo.java index b28a9fd4307..a639ff53ca9 100644 --- a/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/ci/CodefreshInfo.java +++ b/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/ci/CodefreshInfo.java @@ -4,6 +4,7 @@ import static datadog.trace.api.git.GitUtils.normalizeBranch; import static datadog.trace.api.git.GitUtils.normalizeTag; +import datadog.trace.api.civisibility.telemetry.tag.Provider; import datadog.trace.api.git.CommitInfo; import datadog.trace.api.git.GitInfo; import datadog.trace.api.git.PersonInfo; @@ -65,4 +66,9 @@ public CIInfo buildCIInfo() { .ciEnvVars(CODEFRESH) .build(); } + + @Override + public Provider getProvider() { + return Provider.CODEFRESH; + } } diff --git a/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/ci/GitLabInfo.java b/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/ci/GitLabInfo.java index 40a69ac5a56..ba31b498ef7 100644 --- a/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/ci/GitLabInfo.java +++ b/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/ci/GitLabInfo.java @@ -5,6 +5,7 @@ import static datadog.trace.api.git.GitUtils.normalizeTag; import static datadog.trace.civisibility.utils.FileUtils.expandTilde; +import datadog.trace.api.civisibility.telemetry.tag.Provider; import datadog.trace.api.git.CommitInfo; import datadog.trace.api.git.GitInfo; import datadog.trace.api.git.GitUtils; @@ -78,4 +79,9 @@ private PersonInfo buildGitCommitAuthor() { return new PersonInfo( personInfo.getName(), personInfo.getEmail(), System.getenv(GITLAB_GIT_COMMIT_TIMESTAMP)); } + + @Override + public Provider getProvider() { + return Provider.GITLAB; + } } 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 3779ac9930d..b3563968077 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 @@ -6,6 +6,7 @@ import static datadog.trace.api.git.GitUtils.normalizeTag; import static datadog.trace.civisibility.utils.FileUtils.expandTilde; +import datadog.trace.api.civisibility.telemetry.tag.Provider; import datadog.trace.api.git.CommitInfo; import datadog.trace.api.git.GitInfo; @@ -110,4 +111,9 @@ private String buildPipelineUrl( private String buildJobUrl(final String host, final String repo, final String commit) { return String.format("%s/%s/commit/%s/checks", host, repo, commit); } + + @Override + public Provider getProvider() { + return Provider.GITHUBACTIONS; + } } diff --git a/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/ci/JenkinsInfo.java b/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/ci/JenkinsInfo.java index 9d0aea215fe..a4d65533428 100644 --- a/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/ci/JenkinsInfo.java +++ b/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/ci/JenkinsInfo.java @@ -6,6 +6,7 @@ import static datadog.trace.api.git.GitUtils.normalizeTag; import static datadog.trace.civisibility.utils.FileUtils.expandTilde; +import datadog.trace.api.civisibility.telemetry.tag.Provider; import datadog.trace.api.git.CommitInfo; import datadog.trace.api.git.GitInfo; import datadog.trace.util.Strings; @@ -137,4 +138,9 @@ private String filterJenkinsJobName(final String jobName, final String gitBranch return jobNameParts[0]; } } + + @Override + public Provider getProvider() { + return Provider.JENKINS; + } } diff --git a/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/ci/TeamcityInfo.java b/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/ci/TeamcityInfo.java index 887f0d14ea1..ed2a0f2de20 100644 --- a/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/ci/TeamcityInfo.java +++ b/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/ci/TeamcityInfo.java @@ -1,5 +1,6 @@ package datadog.trace.civisibility.ci; +import datadog.trace.api.civisibility.telemetry.tag.Provider; import datadog.trace.api.git.CommitInfo; import datadog.trace.api.git.GitInfo; @@ -22,4 +23,9 @@ public CIInfo buildCIInfo() { .ciJobUrl(System.getenv(BUILD_URL)) .build(); } + + @Override + public Provider getProvider() { + return Provider.TEAMCITY; + } } diff --git a/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/ci/TravisInfo.java b/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/ci/TravisInfo.java index 3d311e5ea85..830f9056291 100644 --- a/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/ci/TravisInfo.java +++ b/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/ci/TravisInfo.java @@ -4,6 +4,7 @@ import static datadog.trace.api.git.GitUtils.normalizeTag; import static datadog.trace.civisibility.utils.FileUtils.expandTilde; +import datadog.trace.api.civisibility.telemetry.tag.Provider; import datadog.trace.api.git.CommitInfo; import datadog.trace.api.git.GitInfo; import datadog.trace.api.git.PersonInfo; @@ -81,4 +82,9 @@ private String buildCiPipelineName() { } return repoSlug; } + + @Override + public Provider getProvider() { + return Provider.TRAVISCI; + } } 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 17f00f983f2..02dfed2bd4a 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 @@ -2,6 +2,7 @@ import static datadog.trace.civisibility.utils.FileUtils.findParentPathBackwards; +import datadog.trace.api.civisibility.telemetry.tag.Provider; import datadog.trace.api.git.GitInfo; import java.nio.file.Path; import org.slf4j.Logger; @@ -69,7 +70,7 @@ protected Path getCurrentPath() { } @Override - public boolean isSupportedCiProvider() { - return false; + public Provider getProvider() { + return Provider.UNSUPPORTED; } } diff --git a/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/communication/TelemetryListener.java b/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/communication/TelemetryListener.java index 4fb25df98a3..db6b0215bfa 100644 --- a/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/communication/TelemetryListener.java +++ b/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/communication/TelemetryListener.java @@ -5,6 +5,9 @@ import datadog.trace.api.civisibility.telemetry.CiVisibilityDistributionMetric; import datadog.trace.api.civisibility.telemetry.CiVisibilityMetricCollector; import datadog.trace.api.civisibility.telemetry.tag.ErrorType; +import datadog.trace.api.civisibility.telemetry.tag.RequestCompressed; +import datadog.trace.api.civisibility.telemetry.tag.ResponseCompressed; +import datadog.trace.api.civisibility.telemetry.tag.StatusCode; import java.io.IOException; import javax.annotation.Nullable; import okhttp3.Call; @@ -12,6 +15,9 @@ public class TelemetryListener extends OkHttpUtils.CustomListener { + private static final String CONTENT_ENCODING_HEADER = "Content-Encoding"; + private static final String GZIP_ENCODING = "gzip"; + private final CiVisibilityMetricCollector metricCollector; private final @Nullable CiVisibilityCountMetric requestCountMetric; private final @Nullable CiVisibilityCountMetric requestErrorsMetric; @@ -19,6 +25,7 @@ public class TelemetryListener extends OkHttpUtils.CustomListener { private final @Nullable CiVisibilityDistributionMetric requestDurationMetric; private final @Nullable CiVisibilityDistributionMetric responseBytesMetric; private long callStartTimestamp; + private boolean responseCompressed; private TelemetryListener( CiVisibilityMetricCollector metricCollector, @@ -38,7 +45,12 @@ private TelemetryListener( public void callStart(Call call) { callStartTimestamp = System.currentTimeMillis(); if (requestCountMetric != null) { - metricCollector.add(requestCountMetric, 1); + metricCollector.add( + requestCountMetric, + 1, + GZIP_ENCODING.equalsIgnoreCase(call.request().header(CONTENT_ENCODING_HEADER)) + ? RequestCompressed.TRUE + : null); } } @@ -52,15 +64,20 @@ public void responseHeadersEnd(Call call, Response response) { if (requestErrorsMetric != null) { if (!response.isSuccessful()) { int responseCode = response.code(); - metricCollector.add(requestErrorsMetric, 1, ErrorType.from(responseCode)); + metricCollector.add( + requestErrorsMetric, 1, ErrorType.from(responseCode), StatusCode.from(responseCode)); } } + responseCompressed = GZIP_ENCODING.equalsIgnoreCase(response.header(CONTENT_ENCODING_HEADER)); } @Override public void responseBodyEnd(Call call, long byteCount) { if (responseBytesMetric != null) { - metricCollector.add(responseBytesMetric, (int) byteCount); + metricCollector.add( + responseBytesMetric, + (int) byteCount, + responseCompressed ? ResponseCompressed.TRUE : null); } } diff --git a/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/domain/AbstractTestSession.java b/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/domain/AbstractTestSession.java index 70d2a159f2e..6f33a80af7a 100644 --- a/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/domain/AbstractTestSession.java +++ b/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/domain/AbstractTestSession.java @@ -6,10 +6,12 @@ import datadog.trace.api.civisibility.telemetry.CiVisibilityCountMetric; import datadog.trace.api.civisibility.telemetry.CiVisibilityMetricCollector; import datadog.trace.api.civisibility.telemetry.TagValue; +import datadog.trace.api.civisibility.telemetry.tag.AutoInjected; import datadog.trace.api.civisibility.telemetry.tag.EventType; import datadog.trace.api.civisibility.telemetry.tag.HasCodeowner; import datadog.trace.api.civisibility.telemetry.tag.IsHeadless; import datadog.trace.api.civisibility.telemetry.tag.IsUnsupportedCI; +import datadog.trace.api.civisibility.telemetry.tag.Provider; import datadog.trace.bootstrap.instrumentation.api.AgentSpan; import datadog.trace.bootstrap.instrumentation.api.AgentTracer; import datadog.trace.bootstrap.instrumentation.api.InternalSpanTypes; @@ -26,7 +28,7 @@ import javax.annotation.Nullable; public abstract class AbstractTestSession { - protected final boolean supportedCiProvider; + protected final Provider ciProvider; protected final InstrumentationType instrumentationType; protected final AgentSpan span; protected final Config config; @@ -41,7 +43,7 @@ public AbstractTestSession( String projectName, @Nullable Long startTime, InstrumentationType instrumentationType, - boolean supportedCiProvider, + Provider ciProvider, Config config, CiVisibilityMetricCollector metricCollector, TestDecorator testDecorator, @@ -49,7 +51,7 @@ public AbstractTestSession( Codeowners codeowners, MethodLinesResolver methodLinesResolver, CoverageProbeStoreFactory coverageProbeStoreFactory) { - this.supportedCiProvider = supportedCiProvider; + this.ciProvider = ciProvider; this.instrumentationType = instrumentationType; this.config = config; this.metricCollector = metricCollector; @@ -91,7 +93,13 @@ public AbstractTestSession( EventType.SESSION, instrumentationType == InstrumentationType.HEADLESS ? IsHeadless.TRUE : null, codeowners.exist() ? HasCodeowner.TRUE : null, - !supportedCiProvider ? IsUnsupportedCI.TRUE : null); + ciProvider == Provider.UNSUPPORTED ? IsUnsupportedCI.TRUE : null); + + metricCollector.add( + CiVisibilityCountMetric.TEST_SESSION, + 1, + ciProvider, + config.isCiVisibilityAutoInjected() ? AutoInjected.TRUE : null); if (instrumentationType == InstrumentationType.MANUAL_API) { metricCollector.add(CiVisibilityCountMetric.MANUAL_API_EVENTS, 1, EventType.SESSION); @@ -139,7 +147,7 @@ private TagValue[] telemetryTags() { if (codeowners.exist()) { telemetryTags.add(HasCodeowner.TRUE); } - if (!supportedCiProvider) { + if (ciProvider == Provider.UNSUPPORTED) { telemetryTags.add(IsUnsupportedCI.TRUE); } telemetryTags.addAll(additionalTelemetryTags()); 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 ec532c7d956..76621670f04 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 @@ -8,6 +8,7 @@ import datadog.trace.api.civisibility.telemetry.CiVisibilityMetricCollector; import datadog.trace.api.civisibility.telemetry.TagValue; import datadog.trace.api.civisibility.telemetry.tag.EarlyFlakeDetectionAbortReason; +import datadog.trace.api.civisibility.telemetry.tag.Provider; import datadog.trace.bootstrap.instrumentation.api.Tags; import datadog.trace.civisibility.InstrumentationType; import datadog.trace.civisibility.codeowners.Codeowners; @@ -68,7 +69,7 @@ public BuildSystemSessionImpl( String repoRoot, String startCommand, @Nullable Long startTime, - boolean supportedCiProvider, + Provider ciProvider, Config config, CiVisibilityMetricCollector metricCollector, TestModuleRegistry testModuleRegistry, @@ -84,7 +85,7 @@ public BuildSystemSessionImpl( projectName, startTime, InstrumentationType.BUILD, - supportedCiProvider, + ciProvider, config, metricCollector, testDecorator, diff --git a/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/domain/headless/HeadlessTestSession.java b/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/domain/headless/HeadlessTestSession.java index e3ef2e360f2..8c5003bf2d4 100644 --- a/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/domain/headless/HeadlessTestSession.java +++ b/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/domain/headless/HeadlessTestSession.java @@ -7,6 +7,7 @@ import datadog.trace.api.civisibility.telemetry.CiVisibilityMetricCollector; import datadog.trace.api.civisibility.telemetry.TagValue; import datadog.trace.api.civisibility.telemetry.tag.EarlyFlakeDetectionAbortReason; +import datadog.trace.api.civisibility.telemetry.tag.Provider; import datadog.trace.bootstrap.instrumentation.api.AgentSpan; import datadog.trace.bootstrap.instrumentation.api.Tags; import datadog.trace.civisibility.InstrumentationType; @@ -36,7 +37,7 @@ public class HeadlessTestSession extends AbstractTestSession implements TestFram public HeadlessTestSession( String projectName, @Nullable Long startTime, - boolean supportedCiProvider, + Provider ciProvider, Config config, CiVisibilityMetricCollector metricCollector, TestDecorator testDecorator, @@ -49,7 +50,7 @@ public HeadlessTestSession( projectName, startTime, InstrumentationType.HEADLESS, - supportedCiProvider, + ciProvider, config, metricCollector, testDecorator, diff --git a/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/domain/manualapi/ManualApiTestSession.java b/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/domain/manualapi/ManualApiTestSession.java index 89c7aafb4a0..69f2be2c396 100644 --- a/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/domain/manualapi/ManualApiTestSession.java +++ b/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/domain/manualapi/ManualApiTestSession.java @@ -3,6 +3,7 @@ import datadog.trace.api.Config; import datadog.trace.api.civisibility.DDTestSession; import datadog.trace.api.civisibility.telemetry.CiVisibilityMetricCollector; +import datadog.trace.api.civisibility.telemetry.tag.Provider; import datadog.trace.civisibility.InstrumentationType; import datadog.trace.civisibility.codeowners.Codeowners; import datadog.trace.civisibility.coverage.CoverageProbeStoreFactory; @@ -21,7 +22,7 @@ public class ManualApiTestSession extends AbstractTestSession implements DDTestS public ManualApiTestSession( String projectName, @Nullable Long startTime, - boolean supportedCiProvider, + Provider ciProvider, Config config, CiVisibilityMetricCollector metricCollector, TestDecorator testDecorator, @@ -33,7 +34,7 @@ public ManualApiTestSession( projectName, startTime, InstrumentationType.MANUAL_API, - supportedCiProvider, + ciProvider, config, metricCollector, testDecorator, diff --git a/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/git/tree/GitClient.java b/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/git/tree/GitClient.java index 0966bf8602e..dd2c3de03e0 100644 --- a/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/git/tree/GitClient.java +++ b/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/git/tree/GitClient.java @@ -556,7 +556,12 @@ private static ExitCode getExitCode(Exception e) { return ExitCode.from(scfe.getExitCode()); } else { - return ExitCode.CODE_UNKNOWN; + String m = e.getMessage(); + if (m != null && m.toLowerCase().contains("no such file or directory")) { + return ExitCode.EXECUTABLE_MISSING; + } else { + return ExitCode.CODE_UNKNOWN; + } } } diff --git a/dd-java-agent/agent-ci-visibility/src/testFixtures/groovy/datadog/trace/civisibility/CiVisibilityInstrumentationTest.groovy b/dd-java-agent/agent-ci-visibility/src/testFixtures/groovy/datadog/trace/civisibility/CiVisibilityInstrumentationTest.groovy index 2830d3a53dd..326aa75ec39 100644 --- a/dd-java-agent/agent-ci-visibility/src/testFixtures/groovy/datadog/trace/civisibility/CiVisibilityInstrumentationTest.groovy +++ b/dd-java-agent/agent-ci-visibility/src/testFixtures/groovy/datadog/trace/civisibility/CiVisibilityInstrumentationTest.groovy @@ -14,6 +14,7 @@ import datadog.trace.api.civisibility.config.TestIdentifier import datadog.trace.api.civisibility.coverage.CoverageBridge import datadog.trace.api.civisibility.events.TestEventsHandler import datadog.trace.api.civisibility.telemetry.CiVisibilityMetricCollector +import datadog.trace.api.civisibility.telemetry.tag.Provider import datadog.trace.api.config.CiVisibilityConfig import datadog.trace.api.config.GeneralConfig import datadog.trace.bootstrap.ContextStore @@ -76,7 +77,7 @@ abstract class CiVisibilityInstrumentationTest extends AgentTestRunner { def rootPath = currentPath.parent dummyModule = rootPath.relativize(currentPath) - def supportedCiProvider = true + def ciProvider = Provider.GITHUBACTIONS def metricCollector = Stub(CiVisibilityMetricCollectorImpl) @@ -127,7 +128,7 @@ abstract class CiVisibilityInstrumentationTest extends AgentTestRunner { return new HeadlessTestSession( projectName, startTime, - supportedCiProvider, + ciProvider, Config.get(), metricCollector, testDecorator, @@ -152,7 +153,7 @@ abstract class CiVisibilityInstrumentationTest extends AgentTestRunner { rootPath.toString(), startCommand, startTime, - supportedCiProvider, + ciProvider, Config.get(), metricCollector, testModuleRegistry, diff --git a/dd-trace-api/src/main/java/datadog/trace/api/config/CiVisibilityConfig.java b/dd-trace-api/src/main/java/datadog/trace/api/config/CiVisibilityConfig.java index f6391e58b33..38a8ff84f6c 100644 --- a/dd-trace-api/src/main/java/datadog/trace/api/config/CiVisibilityConfig.java +++ b/dd-trace-api/src/main/java/datadog/trace/api/config/CiVisibilityConfig.java @@ -66,6 +66,8 @@ public final class CiVisibilityConfig { public static final String CIVISIBILITY_TELEMETRY_ENABLED = "civisibility.telemetry.enabled"; public static final String CIVISIBILITY_RUM_FLUSH_WAIT_MILLIS = "civisibility.rum.flush.wait.millis"; + public static final String CIVISIBILITY_AUTO_INSTRUMENTATION_PROVIDER = + "civisibility.auto.instrumentation.provider"; /* COVERAGE SETTINGS */ public static final String CIVISIBILITY_CODE_COVERAGE_ENABLED = diff --git a/dd-trace-core/src/main/java/datadog/trace/common/writer/ddintake/TelemetryListener.java b/dd-trace-core/src/main/java/datadog/trace/common/writer/ddintake/TelemetryListener.java index ffb87ffce76..b23ab1c43df 100644 --- a/dd-trace-core/src/main/java/datadog/trace/common/writer/ddintake/TelemetryListener.java +++ b/dd-trace-core/src/main/java/datadog/trace/common/writer/ddintake/TelemetryListener.java @@ -6,12 +6,17 @@ import datadog.trace.api.civisibility.telemetry.CiVisibilityDistributionMetric; import datadog.trace.api.civisibility.telemetry.tag.Endpoint; import datadog.trace.api.civisibility.telemetry.tag.ErrorType; +import datadog.trace.api.civisibility.telemetry.tag.RequestCompressed; +import datadog.trace.api.civisibility.telemetry.tag.StatusCode; import java.io.IOException; import okhttp3.Call; import okhttp3.Response; public class TelemetryListener extends OkHttpUtils.CustomListener { + private static final String CONTENT_ENCODING_HEADER = "Content-Encoding"; + private static final String GZIP_ENCODING = "gzip"; + private final Endpoint endpoint; private long callStartTimestamp; @@ -22,7 +27,13 @@ public TelemetryListener(Endpoint endpoint) { public void callStart(Call call) { callStartTimestamp = System.currentTimeMillis(); InstrumentationBridge.getMetricCollector() - .add(CiVisibilityCountMetric.ENDPOINT_PAYLOAD_REQUESTS, 1, endpoint); + .add( + CiVisibilityCountMetric.ENDPOINT_PAYLOAD_REQUESTS, + 1, + endpoint, + GZIP_ENCODING.equalsIgnoreCase(call.request().header(CONTENT_ENCODING_HEADER)) + ? RequestCompressed.TRUE + : null); } public void requestBodyEnd(Call call, long byteCount) { @@ -38,7 +49,8 @@ public void responseHeadersEnd(Call call, Response response) { CiVisibilityCountMetric.ENDPOINT_PAYLOAD_REQUESTS_ERRORS, 1, endpoint, - ErrorType.from(responseCode)); + ErrorType.from(responseCode), + StatusCode.from(responseCode)); } } diff --git a/internal-api/build.gradle b/internal-api/build.gradle index 4b0401f16ff..c4584e0939b 100644 --- a/internal-api/build.gradle +++ b/internal-api/build.gradle @@ -101,6 +101,8 @@ excludedClassesCoverage += [ "datadog.trace.api.civisibility.events.TestSuiteDescriptor", "datadog.trace.api.civisibility.telemetry.tag.ErrorType", "datadog.trace.api.civisibility.telemetry.tag.ExitCode", + "datadog.trace.api.civisibility.telemetry.tag.ResponseCompressed", + "datadog.trace.api.civisibility.telemetry.tag.StatusCode", "datadog.trace.api.civisibility.telemetry.CiVisibilityCountMetric.IndexHolder", "datadog.trace.api.civisibility.telemetry.CiVisibilityDistributionMetric", "datadog.trace.api.civisibility.telemetry.CiVisibilityMetricData", 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 eff1daf6949..554f6e47196 100644 --- a/internal-api/src/main/java/datadog/trace/api/Config.java +++ b/internal-api/src/main/java/datadog/trace/api/Config.java @@ -167,6 +167,7 @@ import static datadog.trace.api.config.CiVisibilityConfig.CIVISIBILITY_AGENTLESS_URL; import static datadog.trace.api.config.CiVisibilityConfig.CIVISIBILITY_AGENT_JAR_URI; import static datadog.trace.api.config.CiVisibilityConfig.CIVISIBILITY_AUTO_CONFIGURATION_ENABLED; +import static datadog.trace.api.config.CiVisibilityConfig.CIVISIBILITY_AUTO_INSTRUMENTATION_PROVIDER; import static datadog.trace.api.config.CiVisibilityConfig.CIVISIBILITY_BACKEND_API_TIMEOUT_MILLIS; import static datadog.trace.api.config.CiVisibilityConfig.CIVISIBILITY_BUILD_INSTRUMENTATION_ENABLED; import static datadog.trace.api.config.CiVisibilityConfig.CIVISIBILITY_CIPROVIDER_INTEGRATION_ENABLED; @@ -827,6 +828,7 @@ static class HostNameHolder { private final String ciVisibilityModuleName; private final boolean ciVisibilityTelemetryEnabled; private final long ciVisibilityRumFlushWaitMillis; + private final boolean ciVisibilityAutoInjected; private final boolean remoteConfigEnabled; private final boolean remoteConfigIntegrityCheckEnabled; @@ -1867,6 +1869,8 @@ PROFILING_DATADOG_PROFILER_ENABLED, isDatadogProfilerSafeInCurrentEnvironment()) ciVisibilityTelemetryEnabled = configProvider.getBoolean(CIVISIBILITY_TELEMETRY_ENABLED, true); ciVisibilityRumFlushWaitMillis = configProvider.getLong(CIVISIBILITY_RUM_FLUSH_WAIT_MILLIS, 500); + ciVisibilityAutoInjected = + Strings.isNotBlank(configProvider.getString(CIVISIBILITY_AUTO_INSTRUMENTATION_PROVIDER)); remoteConfigEnabled = configProvider.getBoolean( @@ -3198,6 +3202,10 @@ public long getCiVisibilityRumFlushWaitMillis() { return ciVisibilityRumFlushWaitMillis; } + public boolean isCiVisibilityAutoInjected() { + return ciVisibilityAutoInjected; + } + public String getAppSecRulesFile() { return appSecRulesFile; } 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 ed558b3166a..4e381141a00 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 @@ -1,5 +1,6 @@ package datadog.trace.api.civisibility.telemetry; +import datadog.trace.api.civisibility.telemetry.tag.AutoInjected; import datadog.trace.api.civisibility.telemetry.tag.BrowserDriver; import datadog.trace.api.civisibility.telemetry.tag.Command; import datadog.trace.api.civisibility.telemetry.tag.CoverageEnabled; @@ -19,12 +20,20 @@ import datadog.trace.api.civisibility.telemetry.tag.ItrEnabled; import datadog.trace.api.civisibility.telemetry.tag.ItrSkipEnabled; import datadog.trace.api.civisibility.telemetry.tag.Library; +import datadog.trace.api.civisibility.telemetry.tag.Provider; +import datadog.trace.api.civisibility.telemetry.tag.RequestCompressed; import datadog.trace.api.civisibility.telemetry.tag.RequireGit; +import datadog.trace.api.civisibility.telemetry.tag.StatusCode; import datadog.trace.api.civisibility.telemetry.tag.TestFrameworkInstrumentation; import java.util.Arrays; public enum CiVisibilityCountMetric { + /** + * The number of test sessions started. This metric is separate from event_created to avoid + * increasing the cardinality too much + */ + TEST_SESSION("test_session", Provider.class, AutoInjected.class), /** The number of events created */ EVENT_CREATED( "event_created", @@ -67,10 +76,10 @@ public enum CiVisibilityCountMetric { /** The number of events enqueued for serialization */ EVENTS_ENQUEUED_FOR_SERIALIZATION("events_enqueued_for_serialization"), /** The number of requests sent to the endpoint, regardless of success */ - ENDPOINT_PAYLOAD_REQUESTS("endpoint_payload.requests", Endpoint.class), + ENDPOINT_PAYLOAD_REQUESTS("endpoint_payload.requests", Endpoint.class, RequestCompressed.class), /** The number of requests sent to the endpoint that errored */ ENDPOINT_PAYLOAD_REQUESTS_ERRORS( - "endpoint_payload.requests_errors", Endpoint.class, ErrorType.class), + "endpoint_payload.requests_errors", Endpoint.class, ErrorType.class, StatusCode.class), /** The number of payloads dropped after all retries */ ENDPOINT_PAYLOAD_DROPPED("endpoint_payload.dropped", Endpoint.class), /** The number of git commands executed */ @@ -78,17 +87,19 @@ public enum CiVisibilityCountMetric { /** The number of git commands that errored */ GIT_COMMAND_ERRORS("git.command_errors", Command.class, ExitCode.class), /** The number of requests sent to the search commit endpoint */ - GIT_REQUESTS_SEARCH_COMMITS("git_requests.search_commits"), + GIT_REQUESTS_SEARCH_COMMITS("git_requests.search_commits", RequestCompressed.class), /** The number of search commit requests sent to the endpoint that errored */ - GIT_REQUESTS_SEARCH_COMMITS_ERRORS("git_requests.search_commits_errors", ErrorType.class), + GIT_REQUESTS_SEARCH_COMMITS_ERRORS( + "git_requests.search_commits_errors", ErrorType.class, StatusCode.class), /** The number of requests sent to the git object pack endpoint */ - GIT_REQUESTS_OBJECTS_PACK("git_requests.objects_pack"), + GIT_REQUESTS_OBJECTS_PACK("git_requests.objects_pack", RequestCompressed.class), /** The number of git object pack requests sent to the endpoint that errored */ - GIT_REQUESTS_OBJECTS_PACK_ERRORS("git_requests.objects_pack_errors", ErrorType.class), + GIT_REQUESTS_OBJECTS_PACK_ERRORS( + "git_requests.objects_pack_errors", ErrorType.class, StatusCode.class), /** The number of requests sent to the settings endpoint, regardless of success */ - GIT_REQUESTS_SETTINGS("git_requests.settings"), + GIT_REQUESTS_SETTINGS("git_requests.settings", RequestCompressed.class), /** The number of settings requests sent to the endpoint that errored */ - GIT_REQUESTS_SETTINGS_ERRORS("git_requests.settings_errors", ErrorType.class), + GIT_REQUESTS_SETTINGS_ERRORS("git_requests.settings_errors", ErrorType.class, StatusCode.class), /** The number of settings responses from the endpoint */ GIT_REQUESTS_SETTINGS_RESPONSE( "git_requests.settings_response", @@ -98,9 +109,10 @@ public enum CiVisibilityCountMetric { EarlyFlakeDetectionEnabled.class, RequireGit.class), /** The number of requests sent to the itr skippable tests endpoint */ - ITR_SKIPPABLE_TESTS_REQUEST("itr_skippable_tests.request"), + ITR_SKIPPABLE_TESTS_REQUEST("itr_skippable_tests.request", RequestCompressed.class), /** The number of itr skippable tests requests sent to the endpoint that errored */ - ITR_SKIPPABLE_TESTS_REQUEST_ERRORS("itr_skippable_tests.request_errors", ErrorType.class), + ITR_SKIPPABLE_TESTS_REQUEST_ERRORS( + "itr_skippable_tests.request_errors", ErrorType.class, StatusCode.class), /** The number of tests to skip returned by the endpoint */ ITR_SKIPPABLE_TESTS_RESPONSE_TESTS("itr_skippable_tests.response_tests"), /** The number of tests or test suites skipped */ @@ -113,9 +125,9 @@ public enum CiVisibilityCountMetric { */ ITR_FORCED_RUN("itr_forced_run", EventType.class), /** The number of requests sent to the known tests endpoint */ - EFD_REQUEST("early_flake_detection.request"), + EFD_REQUEST("early_flake_detection.request", RequestCompressed.class), /** The number of known tests requests sent to the endpoint that errored */ - EFD_REQUEST_ERRORS("early_flake_detection.request_errors", ErrorType.class); + EFD_REQUEST_ERRORS("early_flake_detection.request_errors", ErrorType.class, StatusCode.class); // need a "holder" class, as accessing static fields from enum constructors is illegal static class IndexHolder { 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 36edf2451cf..78bdba67119 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 @@ -2,6 +2,7 @@ import datadog.trace.api.civisibility.telemetry.tag.Command; import datadog.trace.api.civisibility.telemetry.tag.Endpoint; +import datadog.trace.api.civisibility.telemetry.tag.ResponseCompressed; import datadog.trace.api.telemetry.MetricCollector; import java.util.ArrayList; import java.util.Arrays; @@ -34,13 +35,14 @@ public enum CiVisibilityDistributionMetric { /** The time it takes to get the response of the itr skippable tests endpoint request in ms */ ITR_SKIPPABLE_TESTS_REQUEST_MS("itr_skippable_tests.request_ms"), /** The number of bytes received by the skippable tests endpoint */ - ITR_SKIPPABLE_TESTS_RESPONSE_BYTES("itr_skippable_tests.response_bytes"), + ITR_SKIPPABLE_TESTS_RESPONSE_BYTES( + "itr_skippable_tests.response_bytes", ResponseCompressed.class), /** The number of files covered inside a coverage payload */ CODE_COVERAGE_FILES("code_coverage.files"), /* The time it takes to get the response of the known tests endpoint request in ms */ EFD_REQUEST_MS("early_flake_detection.request_ms"), /** The number of bytes received by the known tests endpoint */ - EFD_RESPONSE_BYTES("early_flake_detection.response_bytes"), + EFD_RESPONSE_BYTES("early_flake_detection.response_bytes", ResponseCompressed.class), /** The number of tests received by the known tests endpoint */ EFD_RESPONSE_TESTS("early_flake_detection.response_tests"); diff --git a/internal-api/src/main/java/datadog/trace/api/civisibility/telemetry/tag/AutoInjected.java b/internal-api/src/main/java/datadog/trace/api/civisibility/telemetry/tag/AutoInjected.java new file mode 100644 index 00000000000..d09889e635a --- /dev/null +++ b/internal-api/src/main/java/datadog/trace/api/civisibility/telemetry/tag/AutoInjected.java @@ -0,0 +1,13 @@ +package datadog.trace.api.civisibility.telemetry.tag; + +import datadog.trace.api.civisibility.telemetry.TagValue; + +/** Whether the tracer was injected using CI-provider-specific auto-instrumentation. */ +public enum AutoInjected implements TagValue { + TRUE; + + @Override + public String asString() { + return "auto_injected:true"; + } +} diff --git a/internal-api/src/main/java/datadog/trace/api/civisibility/telemetry/tag/ExitCode.java b/internal-api/src/main/java/datadog/trace/api/civisibility/telemetry/tag/ExitCode.java index b17e577b327..c0a88c65224 100644 --- a/internal-api/src/main/java/datadog/trace/api/civisibility/telemetry/tag/ExitCode.java +++ b/internal-api/src/main/java/datadog/trace/api/civisibility/telemetry/tag/ExitCode.java @@ -11,6 +11,7 @@ public enum ExitCode implements TagValue { CODE_127("127"), CODE_128("128"), CODE_129("129"), + EXECUTABLE_MISSING("missing"), CODE_UNKNOWN("unknown"); private final String s; diff --git a/internal-api/src/main/java/datadog/trace/api/civisibility/telemetry/tag/Provider.java b/internal-api/src/main/java/datadog/trace/api/civisibility/telemetry/tag/Provider.java new file mode 100644 index 00000000000..702bd8d5713 --- /dev/null +++ b/internal-api/src/main/java/datadog/trace/api/civisibility/telemetry/tag/Provider.java @@ -0,0 +1,33 @@ +package datadog.trace.api.civisibility.telemetry.tag; + +import datadog.trace.api.civisibility.telemetry.TagValue; + +/** What kind of CI provider is running the test session. */ +public enum Provider implements TagValue { + APPVEYOR, + AWS, + AZP, + BITBUCKET, + BITRISE, + BUILDKITE, + CIRCLECI, + CODEFRESH, + GITHUBACTIONS, + GITLAB, + JENKINS, + TEAMCITY, + TRAVISCI, + BUDDYCI, + UNSUPPORTED; + + private final String s; + + Provider() { + s = "provider:" + name().toLowerCase(); + } + + @Override + public String asString() { + return s; + } +} diff --git a/internal-api/src/main/java/datadog/trace/api/civisibility/telemetry/tag/RequestCompressed.java b/internal-api/src/main/java/datadog/trace/api/civisibility/telemetry/tag/RequestCompressed.java new file mode 100644 index 00000000000..11bbb375d37 --- /dev/null +++ b/internal-api/src/main/java/datadog/trace/api/civisibility/telemetry/tag/RequestCompressed.java @@ -0,0 +1,13 @@ +package datadog.trace.api.civisibility.telemetry.tag; + +import datadog.trace.api.civisibility.telemetry.TagValue; + +/** Whether request body is compressed. */ +public enum RequestCompressed implements TagValue { + TRUE; + + @Override + public String asString() { + return "rq_compressed:true"; + } +} diff --git a/internal-api/src/main/java/datadog/trace/api/civisibility/telemetry/tag/ResponseCompressed.java b/internal-api/src/main/java/datadog/trace/api/civisibility/telemetry/tag/ResponseCompressed.java new file mode 100644 index 00000000000..bb0e1fa73fb --- /dev/null +++ b/internal-api/src/main/java/datadog/trace/api/civisibility/telemetry/tag/ResponseCompressed.java @@ -0,0 +1,13 @@ +package datadog.trace.api.civisibility.telemetry.tag; + +import datadog.trace.api.civisibility.telemetry.TagValue; + +/** Whether response body is compressed. */ +public enum ResponseCompressed implements TagValue { + TRUE; + + @Override + public String asString() { + return "rs_compressed:true"; + } +} diff --git a/internal-api/src/main/java/datadog/trace/api/civisibility/telemetry/tag/StatusCode.java b/internal-api/src/main/java/datadog/trace/api/civisibility/telemetry/tag/StatusCode.java new file mode 100644 index 00000000000..850b1be8d7f --- /dev/null +++ b/internal-api/src/main/java/datadog/trace/api/civisibility/telemetry/tag/StatusCode.java @@ -0,0 +1,45 @@ +package datadog.trace.api.civisibility.telemetry.tag; + +import datadog.trace.api.civisibility.telemetry.TagValue; +import javax.annotation.Nullable; + +/** The type of HTTP request error */ +public enum StatusCode implements TagValue { + BAD_REQUEST(400), + UNAUTHORIZED(401), + FORBIDDEN(403), + NOT_FOUND(404), + REQUEST_TIMEOUT(408), + TOO_MANY_REQUESTS(429); + + private final String s; + + StatusCode(int code) { + s = "status_code:" + code; + } + + @Override + public String asString() { + return s; + } + + @Nullable + public static StatusCode from(int responseCode) { + switch (responseCode) { + case 400: + return BAD_REQUEST; + case 401: + return UNAUTHORIZED; + case 403: + return FORBIDDEN; + case 404: + return NOT_FOUND; + case 408: + return REQUEST_TIMEOUT; + case 429: + return TOO_MANY_REQUESTS; + default: + return null; + } + } +}