From 6ae2190c1978342e909ff53e5cbe5b840e11349b Mon Sep 17 00:00:00 2001 From: Daniel Mohedano Date: Wed, 30 Apr 2025 17:08:44 +0200 Subject: [PATCH 1/6] add sha discrepancies telemetry --- .../git/CILocalGitInfoBuilder.java | 12 ++ .../git/CIProviderGitInfoBuilder.java | 12 ++ .../git/GitClientGitInfoBuilder.java | 12 ++ .../telemetry/CiVisibilityCountMetric.java | 8 ++ .../telemetry/tag/ExpectedGitProvider.java | 22 ++++ .../telemetry/tag/MismatchGitProvider.java | 22 ++++ .../civisibility/telemetry/tag/ShaMatch.java | 19 +++ .../telemetry/tag/ShaMismatchType.java | 19 +++ .../trace/api/git/EmbeddedGitInfoBuilder.java | 12 ++ .../datadog/trace/api/git/GitInfoBuilder.java | 5 + .../trace/api/git/GitInfoProvider.java | 121 ++++++++++++++---- .../api/git/UserSuppliedGitInfoBuilder.java | 12 ++ 12 files changed, 253 insertions(+), 23 deletions(-) create mode 100644 internal-api/src/main/java/datadog/trace/api/civisibility/telemetry/tag/ExpectedGitProvider.java create mode 100644 internal-api/src/main/java/datadog/trace/api/civisibility/telemetry/tag/MismatchGitProvider.java create mode 100644 internal-api/src/main/java/datadog/trace/api/civisibility/telemetry/tag/ShaMatch.java create mode 100644 internal-api/src/main/java/datadog/trace/api/civisibility/telemetry/tag/ShaMismatchType.java diff --git a/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/git/CILocalGitInfoBuilder.java b/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/git/CILocalGitInfoBuilder.java index aadaf9968f7..fb187034f26 100644 --- a/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/git/CILocalGitInfoBuilder.java +++ b/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/git/CILocalGitInfoBuilder.java @@ -1,5 +1,7 @@ package datadog.trace.civisibility.git; +import datadog.trace.api.civisibility.telemetry.tag.ExpectedGitProvider; +import datadog.trace.api.civisibility.telemetry.tag.MismatchGitProvider; import datadog.trace.api.git.GitInfo; import datadog.trace.api.git.GitInfoBuilder; import datadog.trace.civisibility.git.tree.GitClient; @@ -54,4 +56,14 @@ private Path getGitPath(String repositoryPath) { public int order() { return 2; } + + @Override + public ExpectedGitProvider getExpectedProviderType() { + return ExpectedGitProvider.LOCAL_GIT; + } + + @Override + public MismatchGitProvider getMismatchProviderType() { + return MismatchGitProvider.LOCAL_GIT; + } } diff --git a/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/git/CIProviderGitInfoBuilder.java b/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/git/CIProviderGitInfoBuilder.java index b4a6d6f0d30..3fee630f249 100644 --- a/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/git/CIProviderGitInfoBuilder.java +++ b/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/git/CIProviderGitInfoBuilder.java @@ -1,6 +1,8 @@ package datadog.trace.civisibility.git; import datadog.trace.api.Config; +import datadog.trace.api.civisibility.telemetry.tag.ExpectedGitProvider; +import datadog.trace.api.civisibility.telemetry.tag.MismatchGitProvider; import datadog.trace.api.git.GitInfo; import datadog.trace.api.git.GitInfoBuilder; import datadog.trace.civisibility.ci.CIProviderInfo; @@ -32,4 +34,14 @@ public GitInfo build(@Nullable String repositoryPath) { public int order() { return 1; } + + @Override + public ExpectedGitProvider getExpectedProviderType() { + return ExpectedGitProvider.CI_PROVIDER; + } + + @Override + public MismatchGitProvider getMismatchProviderType() { + return MismatchGitProvider.CI_PROVIDER; + } } diff --git a/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/git/GitClientGitInfoBuilder.java b/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/git/GitClientGitInfoBuilder.java index 6c22c91ff56..d44c9c1baa7 100644 --- a/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/git/GitClientGitInfoBuilder.java +++ b/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/git/GitClientGitInfoBuilder.java @@ -1,6 +1,8 @@ package datadog.trace.civisibility.git; import datadog.trace.api.Config; +import datadog.trace.api.civisibility.telemetry.tag.ExpectedGitProvider; +import datadog.trace.api.civisibility.telemetry.tag.MismatchGitProvider; import datadog.trace.api.git.CommitInfo; import datadog.trace.api.git.GitInfo; import datadog.trace.api.git.GitInfoBuilder; @@ -64,4 +66,14 @@ public GitInfo build(@Nullable String repositoryPath) { public int order() { return 3; } + + @Override + public ExpectedGitProvider getExpectedProviderType() { + return ExpectedGitProvider.GIT_CLIENT; + } + + @Override + public MismatchGitProvider getMismatchProviderType() { + return MismatchGitProvider.GIT_CLIENT; + } } 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 9bf734eeab6..6aa02940de2 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 @@ -12,6 +12,7 @@ import datadog.trace.api.civisibility.telemetry.tag.ErrorType; import datadog.trace.api.civisibility.telemetry.tag.EventType; import datadog.trace.api.civisibility.telemetry.tag.ExitCode; +import datadog.trace.api.civisibility.telemetry.tag.ExpectedGitProvider; import datadog.trace.api.civisibility.telemetry.tag.FailFastTestOrderEnabled; import datadog.trace.api.civisibility.telemetry.tag.FlakyTestRetriesEnabled; import datadog.trace.api.civisibility.telemetry.tag.HasCodeowner; @@ -29,10 +30,13 @@ import datadog.trace.api.civisibility.telemetry.tag.ItrEnabled; import datadog.trace.api.civisibility.telemetry.tag.ItrSkipEnabled; import datadog.trace.api.civisibility.telemetry.tag.KnownTestsEnabled; +import datadog.trace.api.civisibility.telemetry.tag.MismatchGitProvider; 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.RetryReason; +import datadog.trace.api.civisibility.telemetry.tag.ShaMatch; +import datadog.trace.api.civisibility.telemetry.tag.ShaMismatchType; import datadog.trace.api.civisibility.telemetry.tag.StatusCode; import datadog.trace.api.civisibility.telemetry.tag.TestFrameworkInstrumentation; import datadog.trace.api.civisibility.telemetry.tag.TestManagementEnabled; @@ -101,6 +105,10 @@ public enum CiVisibilityCountMetric { GIT_COMMAND("git.command", Command.class), /** The number of git commands that errored */ GIT_COMMAND_ERRORS("git.command_errors", Command.class, ExitCode.class), + /** Number of commit sha comparisons and if they matched when building git info for a repo */ + GIT_COMMIT_SHA_MATCH("git.commit_sha_match", ShaMatch.class), + /** Number of sha mismatches when building git info for a repo */ + GIT_COMMIT_SHA_MATCH_ERROR("git.commit_sha_match_error", ExpectedGitProvider.class, MismatchGitProvider.class, ShaMismatchType.class), /** The number of requests sent to the search commit endpoint */ GIT_REQUESTS_SEARCH_COMMITS("git_requests.search_commits", RequestCompressed.class), /** The number of search commit requests sent to the endpoint that errored */ diff --git a/internal-api/src/main/java/datadog/trace/api/civisibility/telemetry/tag/ExpectedGitProvider.java b/internal-api/src/main/java/datadog/trace/api/civisibility/telemetry/tag/ExpectedGitProvider.java new file mode 100644 index 00000000000..80b8aab0bce --- /dev/null +++ b/internal-api/src/main/java/datadog/trace/api/civisibility/telemetry/tag/ExpectedGitProvider.java @@ -0,0 +1,22 @@ +package datadog.trace.api.civisibility.telemetry.tag; + +import datadog.trace.api.civisibility.telemetry.TagValue; + +public enum ExpectedGitProvider implements TagValue { + USER_SUPPLIED, + CI_PROVIDER, + LOCAL_GIT, + GIT_CLIENT, + EMBEDDED; + + private final String s; + + ExpectedGitProvider() { + s = "expected_provider:" + name().toLowerCase(); + } + + @Override + public String asString() { + return s; + } +} diff --git a/internal-api/src/main/java/datadog/trace/api/civisibility/telemetry/tag/MismatchGitProvider.java b/internal-api/src/main/java/datadog/trace/api/civisibility/telemetry/tag/MismatchGitProvider.java new file mode 100644 index 00000000000..ef829c3b904 --- /dev/null +++ b/internal-api/src/main/java/datadog/trace/api/civisibility/telemetry/tag/MismatchGitProvider.java @@ -0,0 +1,22 @@ +package datadog.trace.api.civisibility.telemetry.tag; + +import datadog.trace.api.civisibility.telemetry.TagValue; + +public enum MismatchGitProvider implements TagValue { + USER_SUPPLIED, + CI_PROVIDER, + LOCAL_GIT, + GIT_CLIENT, + EMBEDDED; + + private final String s; + + MismatchGitProvider() { + s = "mismatch_provider:" + name().toLowerCase(); + } + + @Override + public String asString() { + return s; + } +} diff --git a/internal-api/src/main/java/datadog/trace/api/civisibility/telemetry/tag/ShaMatch.java b/internal-api/src/main/java/datadog/trace/api/civisibility/telemetry/tag/ShaMatch.java new file mode 100644 index 00000000000..c97bd61ffd7 --- /dev/null +++ b/internal-api/src/main/java/datadog/trace/api/civisibility/telemetry/tag/ShaMatch.java @@ -0,0 +1,19 @@ +package datadog.trace.api.civisibility.telemetry.tag; + +import datadog.trace.api.civisibility.telemetry.TagValue; + +public enum ShaMatch implements TagValue { + TRUE, + FALSE; + + private final String s; + + ShaMatch() { + s = "matched:" + name().toLowerCase(); + } + + @Override + public String asString() { + return s; + } +} diff --git a/internal-api/src/main/java/datadog/trace/api/civisibility/telemetry/tag/ShaMismatchType.java b/internal-api/src/main/java/datadog/trace/api/civisibility/telemetry/tag/ShaMismatchType.java new file mode 100644 index 00000000000..855d17aae6b --- /dev/null +++ b/internal-api/src/main/java/datadog/trace/api/civisibility/telemetry/tag/ShaMismatchType.java @@ -0,0 +1,19 @@ +package datadog.trace.api.civisibility.telemetry.tag; + +import datadog.trace.api.civisibility.telemetry.TagValue; + +public enum ShaMismatchType implements TagValue { + REPOSITORY_MISMATCH, + COMMIT_MISMATCH; + + private final String s; + + ShaMismatchType() { + s = "type:" + name().toLowerCase(); + } + + @Override + public String asString() { + return s; + } +} 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 c388f5471d0..8fb56a45538 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 @@ -1,5 +1,7 @@ package datadog.trace.api.git; +import datadog.trace.api.civisibility.telemetry.tag.ExpectedGitProvider; +import datadog.trace.api.civisibility.telemetry.tag.MismatchGitProvider; import java.io.IOException; import java.io.InputStream; import java.util.Arrays; @@ -89,4 +91,14 @@ public GitInfo build(@Nullable String repositoryPath) { public int order() { return Integer.MAX_VALUE; } + + @Override + public ExpectedGitProvider getExpectedProviderType() { + return ExpectedGitProvider.EMBEDDED; + } + + @Override + public MismatchGitProvider getMismatchProviderType() { + return MismatchGitProvider.EMBEDDED; + } } diff --git a/internal-api/src/main/java/datadog/trace/api/git/GitInfoBuilder.java b/internal-api/src/main/java/datadog/trace/api/git/GitInfoBuilder.java index a498407532b..50b5146eb92 100644 --- a/internal-api/src/main/java/datadog/trace/api/git/GitInfoBuilder.java +++ b/internal-api/src/main/java/datadog/trace/api/git/GitInfoBuilder.java @@ -1,9 +1,14 @@ package datadog.trace.api.git; +import datadog.trace.api.civisibility.telemetry.tag.ExpectedGitProvider; +import datadog.trace.api.civisibility.telemetry.tag.MismatchGitProvider; import javax.annotation.Nullable; public interface GitInfoBuilder { GitInfo build(@Nullable String repositoryPath); int order(); + + ExpectedGitProvider getExpectedProviderType(); + MismatchGitProvider getMismatchProviderType(); } 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 02f95eedbb5..bca7a2b3964 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 @@ -2,15 +2,24 @@ import datadog.trace.api.cache.DDCache; import datadog.trace.api.cache.DDCaches; +import datadog.trace.api.civisibility.InstrumentationBridge; +import datadog.trace.api.civisibility.telemetry.CiVisibilityCountMetric; +import datadog.trace.api.civisibility.telemetry.tag.ExpectedGitProvider; +import datadog.trace.api.civisibility.telemetry.tag.MismatchGitProvider; +import datadog.trace.api.civisibility.telemetry.tag.ShaMatch; +import datadog.trace.api.civisibility.telemetry.tag.ShaMismatchType; import datadog.trace.util.Strings; import java.nio.file.Paths; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.Comparator; +import java.util.HashSet; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; +import java.util.Objects; +import java.util.Set; import java.util.function.Function; import java.util.function.Predicate; import javax.annotation.Nullable; @@ -51,30 +60,42 @@ public GitInfo getGitInfo(@Nullable String repositoryPath) { private GitInfo buildGitInfo(String repositoryPath) { Evaluator evaluator = new Evaluator(repositoryPath, builders); - return 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( + 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)), 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)), - evaluator.getIfCommitShaMatches( - gi -> gi.getCommit().getFullMessage(), Strings::isNotBlank))); + gi -> gi.getCommit().getFullMessage(), Strings::isNotBlank))); + + InstrumentationBridge.getMetricCollector() + .add( + CiVisibilityCountMetric.GIT_COMMIT_SHA_MATCH, + 1, + evaluator.shaMismatches.isEmpty() ? ShaMatch.TRUE : ShaMatch.FALSE); + for (ShaMismatch mismatch : evaluator.shaMismatches) { + mismatch.addTelemetry(); + } + + return gitInfo; } private static boolean validateGitRemoteUrl(String s) { @@ -82,6 +103,46 @@ private static boolean validateGitRemoteUrl(String s) { return Strings.isNotBlank(s) && !s.startsWith("file:"); } + private static final class ShaMismatch { + private final ExpectedGitProvider expectedGitProvider; + private final MismatchGitProvider mismatchGitProvider; + private final ShaMismatchType shaMismatchType; + + private ShaMismatch( + ExpectedGitProvider expectedGitProvider, + MismatchGitProvider mismatchGitProvider, + ShaMismatchType shaMismatchType) { + this.expectedGitProvider = expectedGitProvider; + this.mismatchGitProvider = mismatchGitProvider; + this.shaMismatchType = shaMismatchType; + } + + private void addTelemetry() { + InstrumentationBridge.getMetricCollector() + .add( + CiVisibilityCountMetric.GIT_COMMIT_SHA_MATCH_ERROR, + 1, + expectedGitProvider, + mismatchGitProvider, + shaMismatchType); + } + + @Override + public boolean equals(Object obj) { + if (this == obj) return true; + if (obj == null || getClass() != obj.getClass()) return false; + ShaMismatch that = (ShaMismatch) obj; + return expectedGitProvider.equals(that.expectedGitProvider) + && mismatchGitProvider.equals(that.mismatchGitProvider) + && shaMismatchType.equals(that.shaMismatchType); + } + + @Override + public int hashCode() { + return Objects.hash(expectedGitProvider, mismatchGitProvider, shaMismatchType); + } + } + /** * Uses provided GitInfoBuilder instances to get GitInfo data. * @@ -95,10 +156,12 @@ private static boolean validateGitRemoteUrl(String s) { private static final class Evaluator { private final String repositoryPath; private final Map infos; + private final Set shaMismatches; private Evaluator(String repositoryPath, Collection builders) { this.repositoryPath = repositoryPath; this.infos = new LinkedHashMap<>(); + this.shaMismatches = new HashSet<>(); for (GitInfoBuilder builder : builders) { infos.put(builder, null); } @@ -122,6 +185,9 @@ private String get( Predicate validator, boolean checkShaIntegrity) { String commitSha = null; + String repositoryURL = null; + ExpectedGitProvider commitShaProvider = null; + for (Map.Entry e : infos.entrySet()) { GitInfo info = e.getValue(); if (info == null) { @@ -136,9 +202,18 @@ private String get( if (Strings.isNotBlank(currentCommitSha)) { if (commitSha == null) { commitSha = currentCommitSha; + repositoryURL = info.getRepositoryURL(); + commitShaProvider = e.getKey().getExpectedProviderType(); } else if (!commitSha.equals(currentCommitSha)) { // We already have a commit SHA from source that has higher priority. // Commit SHA from current source is different, so we have to skip it + shaMismatches.add( + new ShaMismatch( + commitShaProvider, + e.getKey().getMismatchProviderType(), + repositoryURL.equals(info.getRepositoryURL()) + ? ShaMismatchType.COMMIT_MISMATCH + : ShaMismatchType.REPOSITORY_MISMATCH)); continue; } } 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 31751ff3bb6..3fae2ddbaf1 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 @@ -1,6 +1,8 @@ package datadog.trace.api.git; import datadog.trace.api.Config; +import datadog.trace.api.civisibility.telemetry.tag.ExpectedGitProvider; +import datadog.trace.api.civisibility.telemetry.tag.MismatchGitProvider; import datadog.trace.api.config.GeneralConfig; import datadog.trace.bootstrap.config.provider.ConfigProvider; import datadog.trace.bootstrap.instrumentation.api.Tags; @@ -106,4 +108,14 @@ public GitInfo build(@Nullable String repositoryPath) { public int order() { return 0; } + + @Override + public ExpectedGitProvider getExpectedProviderType() { + return ExpectedGitProvider.USER_SUPPLIED; + } + + @Override + public MismatchGitProvider getMismatchProviderType() { + return MismatchGitProvider.USER_SUPPLIED; + } } From b9053870144fd0e3f818464c34404bb144ac4fe3 Mon Sep 17 00:00:00 2001 From: Daniel Mohedano Date: Mon, 5 May 2025 12:15:52 +0200 Subject: [PATCH 2/6] unified naming and simplified git provider tag implementation --- .../git/CILocalGitInfoBuilder.java | 16 +++-- .../git/CIProviderGitInfoBuilder.java | 16 +++-- .../git/GitClientGitInfoBuilder.java | 16 +++-- .../telemetry/CiVisibilityCountMetric.java | 11 ++-- .../telemetry/tag/ExpectedGitProvider.java | 22 ------- .../telemetry/tag/GitProvider.java | 52 +++++++++++++++ ...chType.java => GitShaDiscrepancyType.java} | 8 +-- .../tag/{ShaMatch.java => GitShaMatch.java} | 4 +- .../telemetry/tag/MismatchGitProvider.java | 22 ------- .../trace/api/git/EmbeddedGitInfoBuilder.java | 16 +++-- .../datadog/trace/api/git/GitInfoBuilder.java | 6 +- .../trace/api/git/GitInfoProvider.java | 63 +++++++++---------- .../api/git/UserSuppliedGitInfoBuilder.java | 16 +++-- 13 files changed, 131 insertions(+), 137 deletions(-) delete mode 100644 internal-api/src/main/java/datadog/trace/api/civisibility/telemetry/tag/ExpectedGitProvider.java create mode 100644 internal-api/src/main/java/datadog/trace/api/civisibility/telemetry/tag/GitProvider.java rename internal-api/src/main/java/datadog/trace/api/civisibility/telemetry/tag/{ShaMismatchType.java => GitShaDiscrepancyType.java} (65%) rename internal-api/src/main/java/datadog/trace/api/civisibility/telemetry/tag/{ShaMatch.java => GitShaMatch.java} (80%) delete mode 100644 internal-api/src/main/java/datadog/trace/api/civisibility/telemetry/tag/MismatchGitProvider.java diff --git a/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/git/CILocalGitInfoBuilder.java b/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/git/CILocalGitInfoBuilder.java index fb187034f26..3c6e00cf102 100644 --- a/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/git/CILocalGitInfoBuilder.java +++ b/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/git/CILocalGitInfoBuilder.java @@ -1,7 +1,6 @@ package datadog.trace.civisibility.git; -import datadog.trace.api.civisibility.telemetry.tag.ExpectedGitProvider; -import datadog.trace.api.civisibility.telemetry.tag.MismatchGitProvider; +import datadog.trace.api.civisibility.telemetry.tag.GitProvider; import datadog.trace.api.git.GitInfo; import datadog.trace.api.git.GitInfoBuilder; import datadog.trace.civisibility.git.tree.GitClient; @@ -58,12 +57,11 @@ public int order() { } @Override - public ExpectedGitProvider getExpectedProviderType() { - return ExpectedGitProvider.LOCAL_GIT; - } - - @Override - public MismatchGitProvider getMismatchProviderType() { - return MismatchGitProvider.LOCAL_GIT; + public GitProvider getProvider(GitProvider.Type type){ + if (type == GitProvider.Type.EXPECTED) { + return GitProvider.LOCAL_GIT_EXPECTED; + } else { + return GitProvider.LOCAL_GIT_DISCREPANT; + } } } diff --git a/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/git/CIProviderGitInfoBuilder.java b/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/git/CIProviderGitInfoBuilder.java index 3fee630f249..95cb14d759d 100644 --- a/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/git/CIProviderGitInfoBuilder.java +++ b/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/git/CIProviderGitInfoBuilder.java @@ -1,8 +1,7 @@ package datadog.trace.civisibility.git; import datadog.trace.api.Config; -import datadog.trace.api.civisibility.telemetry.tag.ExpectedGitProvider; -import datadog.trace.api.civisibility.telemetry.tag.MismatchGitProvider; +import datadog.trace.api.civisibility.telemetry.tag.GitProvider; import datadog.trace.api.git.GitInfo; import datadog.trace.api.git.GitInfoBuilder; import datadog.trace.civisibility.ci.CIProviderInfo; @@ -36,12 +35,11 @@ public int order() { } @Override - public ExpectedGitProvider getExpectedProviderType() { - return ExpectedGitProvider.CI_PROVIDER; - } - - @Override - public MismatchGitProvider getMismatchProviderType() { - return MismatchGitProvider.CI_PROVIDER; + public GitProvider getProvider(GitProvider.Type type){ + if (type == GitProvider.Type.EXPECTED) { + return GitProvider.CI_PROVIDER_EXPECTED; + } else { + return GitProvider.CI_PROVIDER_DISCREPANT; + } } } diff --git a/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/git/GitClientGitInfoBuilder.java b/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/git/GitClientGitInfoBuilder.java index d44c9c1baa7..deaad6faae8 100644 --- a/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/git/GitClientGitInfoBuilder.java +++ b/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/git/GitClientGitInfoBuilder.java @@ -1,8 +1,7 @@ package datadog.trace.civisibility.git; import datadog.trace.api.Config; -import datadog.trace.api.civisibility.telemetry.tag.ExpectedGitProvider; -import datadog.trace.api.civisibility.telemetry.tag.MismatchGitProvider; +import datadog.trace.api.civisibility.telemetry.tag.GitProvider; import datadog.trace.api.git.CommitInfo; import datadog.trace.api.git.GitInfo; import datadog.trace.api.git.GitInfoBuilder; @@ -68,12 +67,11 @@ public int order() { } @Override - public ExpectedGitProvider getExpectedProviderType() { - return ExpectedGitProvider.GIT_CLIENT; - } - - @Override - public MismatchGitProvider getMismatchProviderType() { - return MismatchGitProvider.GIT_CLIENT; + public GitProvider getProvider(GitProvider.Type type) { + if (type == GitProvider.Type.EXPECTED) { + return GitProvider.GIT_CLIENT_EXPECTED; + } else { + return GitProvider.GIT_CLIENT_DISCREPANT; + } } } 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 6aa02940de2..1380cd1cf82 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 @@ -12,9 +12,9 @@ import datadog.trace.api.civisibility.telemetry.tag.ErrorType; import datadog.trace.api.civisibility.telemetry.tag.EventType; import datadog.trace.api.civisibility.telemetry.tag.ExitCode; -import datadog.trace.api.civisibility.telemetry.tag.ExpectedGitProvider; import datadog.trace.api.civisibility.telemetry.tag.FailFastTestOrderEnabled; import datadog.trace.api.civisibility.telemetry.tag.FlakyTestRetriesEnabled; +import datadog.trace.api.civisibility.telemetry.tag.GitProvider; import datadog.trace.api.civisibility.telemetry.tag.HasCodeowner; import datadog.trace.api.civisibility.telemetry.tag.HasFailedAllRetries; import datadog.trace.api.civisibility.telemetry.tag.ImpactedTestsDetectionEnabled; @@ -30,13 +30,12 @@ import datadog.trace.api.civisibility.telemetry.tag.ItrEnabled; import datadog.trace.api.civisibility.telemetry.tag.ItrSkipEnabled; import datadog.trace.api.civisibility.telemetry.tag.KnownTestsEnabled; -import datadog.trace.api.civisibility.telemetry.tag.MismatchGitProvider; 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.RetryReason; -import datadog.trace.api.civisibility.telemetry.tag.ShaMatch; -import datadog.trace.api.civisibility.telemetry.tag.ShaMismatchType; +import datadog.trace.api.civisibility.telemetry.tag.GitShaMatch; +import datadog.trace.api.civisibility.telemetry.tag.GitShaDiscrepancyType; import datadog.trace.api.civisibility.telemetry.tag.StatusCode; import datadog.trace.api.civisibility.telemetry.tag.TestFrameworkInstrumentation; import datadog.trace.api.civisibility.telemetry.tag.TestManagementEnabled; @@ -106,9 +105,9 @@ public enum CiVisibilityCountMetric { /** The number of git commands that errored */ GIT_COMMAND_ERRORS("git.command_errors", Command.class, ExitCode.class), /** Number of commit sha comparisons and if they matched when building git info for a repo */ - GIT_COMMIT_SHA_MATCH("git.commit_sha_match", ShaMatch.class), + GIT_COMMIT_SHA_MATCH("git.commit_sha_match", GitShaMatch.class), /** Number of sha mismatches when building git info for a repo */ - GIT_COMMIT_SHA_MATCH_ERROR("git.commit_sha_match_error", ExpectedGitProvider.class, MismatchGitProvider.class, ShaMismatchType.class), + GIT_COMMIT_SHA_DISCREPANCY("git.commit_sha_discrepancy", GitProvider.class, GitProvider.class, GitShaDiscrepancyType.class), /** The number of requests sent to the search commit endpoint */ GIT_REQUESTS_SEARCH_COMMITS("git_requests.search_commits", RequestCompressed.class), /** The number of search commit requests sent to the endpoint that errored */ diff --git a/internal-api/src/main/java/datadog/trace/api/civisibility/telemetry/tag/ExpectedGitProvider.java b/internal-api/src/main/java/datadog/trace/api/civisibility/telemetry/tag/ExpectedGitProvider.java deleted file mode 100644 index 80b8aab0bce..00000000000 --- a/internal-api/src/main/java/datadog/trace/api/civisibility/telemetry/tag/ExpectedGitProvider.java +++ /dev/null @@ -1,22 +0,0 @@ -package datadog.trace.api.civisibility.telemetry.tag; - -import datadog.trace.api.civisibility.telemetry.TagValue; - -public enum ExpectedGitProvider implements TagValue { - USER_SUPPLIED, - CI_PROVIDER, - LOCAL_GIT, - GIT_CLIENT, - EMBEDDED; - - private final String s; - - ExpectedGitProvider() { - s = "expected_provider:" + name().toLowerCase(); - } - - @Override - public String asString() { - return s; - } -} diff --git a/internal-api/src/main/java/datadog/trace/api/civisibility/telemetry/tag/GitProvider.java b/internal-api/src/main/java/datadog/trace/api/civisibility/telemetry/tag/GitProvider.java new file mode 100644 index 00000000000..675b5dafe7b --- /dev/null +++ b/internal-api/src/main/java/datadog/trace/api/civisibility/telemetry/tag/GitProvider.java @@ -0,0 +1,52 @@ +package datadog.trace.api.civisibility.telemetry.tag; + +import datadog.trace.api.civisibility.telemetry.TagValue; + +public enum GitProvider implements TagValue { + USER_SUPPLIED_EXPECTED(Type.EXPECTED, Source.USER_SUPPLIED), + USER_SUPPLIED_DISCREPANT(Type.DISCREPANT, Source.USER_SUPPLIED), + + CI_PROVIDER_EXPECTED(Type.EXPECTED, Source.CI_PROVIDER), + CI_PROVIDER_DISCREPANT(Type.DISCREPANT, Source.CI_PROVIDER), + + LOCAL_GIT_EXPECTED(Type.EXPECTED, Source.LOCAL_GIT), + LOCAL_GIT_DISCREPANT(Type.DISCREPANT, Source.LOCAL_GIT), + + GIT_CLIENT_EXPECTED(Type.EXPECTED, Source.GIT_CLIENT), + GIT_CLIENT_DISCREPANT(Type.DISCREPANT, Source.GIT_CLIENT), + + EMBEDDED_EXPECTED(Type.EXPECTED, Source.EMBEDDED), + EMBEDDED_DISCREPANT(Type.DISCREPANT, Source.EMBEDDED); + + private final Type type; + private final Source source; + + GitProvider(Type type, Source source) { + this.type = type; + this.source = source; + } + + @Override + public String asString() { + return type.getTag() + ":" + source.name().toLowerCase(); + } + + private enum Source { + USER_SUPPLIED, CI_PROVIDER, LOCAL_GIT, GIT_CLIENT, EMBEDDED; + } + + public enum Type { + EXPECTED("expected_provider"), + DISCREPANT("discrepant_provider"); + + private final String tag; + + Type(String tag) { + this.tag = tag; + } + + public String getTag() { + return tag; + } + } +} diff --git a/internal-api/src/main/java/datadog/trace/api/civisibility/telemetry/tag/ShaMismatchType.java b/internal-api/src/main/java/datadog/trace/api/civisibility/telemetry/tag/GitShaDiscrepancyType.java similarity index 65% rename from internal-api/src/main/java/datadog/trace/api/civisibility/telemetry/tag/ShaMismatchType.java rename to internal-api/src/main/java/datadog/trace/api/civisibility/telemetry/tag/GitShaDiscrepancyType.java index 855d17aae6b..176274c66c3 100644 --- a/internal-api/src/main/java/datadog/trace/api/civisibility/telemetry/tag/ShaMismatchType.java +++ b/internal-api/src/main/java/datadog/trace/api/civisibility/telemetry/tag/GitShaDiscrepancyType.java @@ -2,13 +2,13 @@ import datadog.trace.api.civisibility.telemetry.TagValue; -public enum ShaMismatchType implements TagValue { - REPOSITORY_MISMATCH, - COMMIT_MISMATCH; +public enum GitShaDiscrepancyType implements TagValue { + REPOSITORY_DISCREPANCY, + COMMIT_DISCREPANCY; private final String s; - ShaMismatchType() { + GitShaDiscrepancyType() { s = "type:" + name().toLowerCase(); } diff --git a/internal-api/src/main/java/datadog/trace/api/civisibility/telemetry/tag/ShaMatch.java b/internal-api/src/main/java/datadog/trace/api/civisibility/telemetry/tag/GitShaMatch.java similarity index 80% rename from internal-api/src/main/java/datadog/trace/api/civisibility/telemetry/tag/ShaMatch.java rename to internal-api/src/main/java/datadog/trace/api/civisibility/telemetry/tag/GitShaMatch.java index c97bd61ffd7..45024a9ed4d 100644 --- a/internal-api/src/main/java/datadog/trace/api/civisibility/telemetry/tag/ShaMatch.java +++ b/internal-api/src/main/java/datadog/trace/api/civisibility/telemetry/tag/GitShaMatch.java @@ -2,13 +2,13 @@ import datadog.trace.api.civisibility.telemetry.TagValue; -public enum ShaMatch implements TagValue { +public enum GitShaMatch implements TagValue { TRUE, FALSE; private final String s; - ShaMatch() { + GitShaMatch() { s = "matched:" + name().toLowerCase(); } diff --git a/internal-api/src/main/java/datadog/trace/api/civisibility/telemetry/tag/MismatchGitProvider.java b/internal-api/src/main/java/datadog/trace/api/civisibility/telemetry/tag/MismatchGitProvider.java deleted file mode 100644 index ef829c3b904..00000000000 --- a/internal-api/src/main/java/datadog/trace/api/civisibility/telemetry/tag/MismatchGitProvider.java +++ /dev/null @@ -1,22 +0,0 @@ -package datadog.trace.api.civisibility.telemetry.tag; - -import datadog.trace.api.civisibility.telemetry.TagValue; - -public enum MismatchGitProvider implements TagValue { - USER_SUPPLIED, - CI_PROVIDER, - LOCAL_GIT, - GIT_CLIENT, - EMBEDDED; - - private final String s; - - MismatchGitProvider() { - s = "mismatch_provider:" + name().toLowerCase(); - } - - @Override - public String asString() { - return s; - } -} 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 8fb56a45538..c272c61140e 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 @@ -1,7 +1,6 @@ package datadog.trace.api.git; -import datadog.trace.api.civisibility.telemetry.tag.ExpectedGitProvider; -import datadog.trace.api.civisibility.telemetry.tag.MismatchGitProvider; +import datadog.trace.api.civisibility.telemetry.tag.GitProvider; import java.io.IOException; import java.io.InputStream; import java.util.Arrays; @@ -93,12 +92,11 @@ public int order() { } @Override - public ExpectedGitProvider getExpectedProviderType() { - return ExpectedGitProvider.EMBEDDED; - } - - @Override - public MismatchGitProvider getMismatchProviderType() { - return MismatchGitProvider.EMBEDDED; + public GitProvider getProvider(GitProvider.Type type){ + if (type == GitProvider.Type.EXPECTED) { + return GitProvider.EMBEDDED_EXPECTED; + } else { + return GitProvider.EMBEDDED_DISCREPANT; + } } } diff --git a/internal-api/src/main/java/datadog/trace/api/git/GitInfoBuilder.java b/internal-api/src/main/java/datadog/trace/api/git/GitInfoBuilder.java index 50b5146eb92..df3143b6b85 100644 --- a/internal-api/src/main/java/datadog/trace/api/git/GitInfoBuilder.java +++ b/internal-api/src/main/java/datadog/trace/api/git/GitInfoBuilder.java @@ -1,7 +1,6 @@ package datadog.trace.api.git; -import datadog.trace.api.civisibility.telemetry.tag.ExpectedGitProvider; -import datadog.trace.api.civisibility.telemetry.tag.MismatchGitProvider; +import datadog.trace.api.civisibility.telemetry.tag.GitProvider; import javax.annotation.Nullable; public interface GitInfoBuilder { @@ -9,6 +8,5 @@ public interface GitInfoBuilder { int order(); - ExpectedGitProvider getExpectedProviderType(); - MismatchGitProvider getMismatchProviderType(); + GitProvider getProvider(GitProvider.Type type); } 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 bca7a2b3964..89af168c60f 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 @@ -4,10 +4,9 @@ import datadog.trace.api.cache.DDCaches; import datadog.trace.api.civisibility.InstrumentationBridge; import datadog.trace.api.civisibility.telemetry.CiVisibilityCountMetric; -import datadog.trace.api.civisibility.telemetry.tag.ExpectedGitProvider; -import datadog.trace.api.civisibility.telemetry.tag.MismatchGitProvider; -import datadog.trace.api.civisibility.telemetry.tag.ShaMatch; -import datadog.trace.api.civisibility.telemetry.tag.ShaMismatchType; +import datadog.trace.api.civisibility.telemetry.tag.GitProvider; +import datadog.trace.api.civisibility.telemetry.tag.GitShaDiscrepancyType; +import datadog.trace.api.civisibility.telemetry.tag.GitShaMatch; import datadog.trace.util.Strings; import java.nio.file.Paths; import java.util.ArrayList; @@ -90,8 +89,8 @@ private GitInfo buildGitInfo(String repositoryPath) { .add( CiVisibilityCountMetric.GIT_COMMIT_SHA_MATCH, 1, - evaluator.shaMismatches.isEmpty() ? ShaMatch.TRUE : ShaMatch.FALSE); - for (ShaMismatch mismatch : evaluator.shaMismatches) { + evaluator.shaDiscrepancies.isEmpty() ? GitShaMatch.TRUE : GitShaMatch.FALSE); + for (ShaDiscrepancy mismatch : evaluator.shaDiscrepancies) { mismatch.addTelemetry(); } @@ -103,43 +102,43 @@ private static boolean validateGitRemoteUrl(String s) { return Strings.isNotBlank(s) && !s.startsWith("file:"); } - private static final class ShaMismatch { - private final ExpectedGitProvider expectedGitProvider; - private final MismatchGitProvider mismatchGitProvider; - private final ShaMismatchType shaMismatchType; + private static final class ShaDiscrepancy { + private final GitProvider expectedGitProvider; + private final GitProvider discrepantGitProvider; + private final GitShaDiscrepancyType discrepancyType; - private ShaMismatch( - ExpectedGitProvider expectedGitProvider, - MismatchGitProvider mismatchGitProvider, - ShaMismatchType shaMismatchType) { + private ShaDiscrepancy( + GitProvider expectedGitProvider, + GitProvider discrepantGitProvider, + GitShaDiscrepancyType discrepancyType) { this.expectedGitProvider = expectedGitProvider; - this.mismatchGitProvider = mismatchGitProvider; - this.shaMismatchType = shaMismatchType; + this.discrepantGitProvider = discrepantGitProvider; + this.discrepancyType = discrepancyType; } private void addTelemetry() { InstrumentationBridge.getMetricCollector() .add( - CiVisibilityCountMetric.GIT_COMMIT_SHA_MATCH_ERROR, + CiVisibilityCountMetric.GIT_COMMIT_SHA_DISCREPANCY, 1, expectedGitProvider, - mismatchGitProvider, - shaMismatchType); + discrepantGitProvider, + discrepancyType); } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null || getClass() != obj.getClass()) return false; - ShaMismatch that = (ShaMismatch) obj; + ShaDiscrepancy that = (ShaDiscrepancy) obj; return expectedGitProvider.equals(that.expectedGitProvider) - && mismatchGitProvider.equals(that.mismatchGitProvider) - && shaMismatchType.equals(that.shaMismatchType); + && discrepantGitProvider.equals(that.discrepantGitProvider) + && discrepancyType.equals(that.discrepancyType); } @Override public int hashCode() { - return Objects.hash(expectedGitProvider, mismatchGitProvider, shaMismatchType); + return Objects.hash(expectedGitProvider, discrepantGitProvider, discrepancyType); } } @@ -156,12 +155,12 @@ public int hashCode() { private static final class Evaluator { private final String repositoryPath; private final Map infos; - private final Set shaMismatches; + private final Set shaDiscrepancies; private Evaluator(String repositoryPath, Collection builders) { this.repositoryPath = repositoryPath; this.infos = new LinkedHashMap<>(); - this.shaMismatches = new HashSet<>(); + this.shaDiscrepancies = new HashSet<>(); for (GitInfoBuilder builder : builders) { infos.put(builder, null); } @@ -186,7 +185,7 @@ private String get( boolean checkShaIntegrity) { String commitSha = null; String repositoryURL = null; - ExpectedGitProvider commitShaProvider = null; + GitProvider commitShaProvider = null; for (Map.Entry e : infos.entrySet()) { GitInfo info = e.getValue(); @@ -203,17 +202,17 @@ private String get( if (commitSha == null) { commitSha = currentCommitSha; repositoryURL = info.getRepositoryURL(); - commitShaProvider = e.getKey().getExpectedProviderType(); + commitShaProvider = e.getKey().getProvider(GitProvider.Type.EXPECTED); } else if (!commitSha.equals(currentCommitSha)) { // We already have a commit SHA from source that has higher priority. // Commit SHA from current source is different, so we have to skip it - shaMismatches.add( - new ShaMismatch( + shaDiscrepancies.add( + new ShaDiscrepancy( commitShaProvider, - e.getKey().getMismatchProviderType(), + e.getKey().getProvider(GitProvider.Type.DISCREPANT), repositoryURL.equals(info.getRepositoryURL()) - ? ShaMismatchType.COMMIT_MISMATCH - : ShaMismatchType.REPOSITORY_MISMATCH)); + ? GitShaDiscrepancyType.COMMIT_DISCREPANCY + : GitShaDiscrepancyType.REPOSITORY_DISCREPANCY)); continue; } } 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 3fae2ddbaf1..67eb13b66be 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 @@ -1,8 +1,7 @@ package datadog.trace.api.git; import datadog.trace.api.Config; -import datadog.trace.api.civisibility.telemetry.tag.ExpectedGitProvider; -import datadog.trace.api.civisibility.telemetry.tag.MismatchGitProvider; +import datadog.trace.api.civisibility.telemetry.tag.GitProvider; import datadog.trace.api.config.GeneralConfig; import datadog.trace.bootstrap.config.provider.ConfigProvider; import datadog.trace.bootstrap.instrumentation.api.Tags; @@ -110,12 +109,11 @@ public int order() { } @Override - public ExpectedGitProvider getExpectedProviderType() { - return ExpectedGitProvider.USER_SUPPLIED; - } - - @Override - public MismatchGitProvider getMismatchProviderType() { - return MismatchGitProvider.USER_SUPPLIED; + public GitProvider getProvider(GitProvider.Type type){ + if (type == GitProvider.Type.EXPECTED) { + return GitProvider.USER_SUPPLIED_EXPECTED; + } else { + return GitProvider.USER_SUPPLIED_DISCREPANT; + } } } From 13576ac465895bbc6bf6aa0d4d2ac25c01e2cf6d Mon Sep 17 00:00:00 2001 From: Daniel Mohedano Date: Mon, 5 May 2025 12:28:48 +0200 Subject: [PATCH 3/6] spotless --- .../trace/civisibility/git/CILocalGitInfoBuilder.java | 2 +- .../civisibility/git/CIProviderGitInfoBuilder.java | 2 +- .../telemetry/CiVisibilityCountMetric.java | 10 +++++++--- .../api/civisibility/telemetry/tag/GitProvider.java | 6 +++++- .../datadog/trace/api/git/EmbeddedGitInfoBuilder.java | 2 +- .../trace/api/git/UserSuppliedGitInfoBuilder.java | 2 +- 6 files changed, 16 insertions(+), 8 deletions(-) diff --git a/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/git/CILocalGitInfoBuilder.java b/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/git/CILocalGitInfoBuilder.java index 3c6e00cf102..6a367cbbff0 100644 --- a/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/git/CILocalGitInfoBuilder.java +++ b/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/git/CILocalGitInfoBuilder.java @@ -57,7 +57,7 @@ public int order() { } @Override - public GitProvider getProvider(GitProvider.Type type){ + public GitProvider getProvider(GitProvider.Type type) { if (type == GitProvider.Type.EXPECTED) { return GitProvider.LOCAL_GIT_EXPECTED; } else { diff --git a/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/git/CIProviderGitInfoBuilder.java b/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/git/CIProviderGitInfoBuilder.java index 95cb14d759d..e75e83e4ecc 100644 --- a/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/git/CIProviderGitInfoBuilder.java +++ b/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/git/CIProviderGitInfoBuilder.java @@ -35,7 +35,7 @@ public int order() { } @Override - public GitProvider getProvider(GitProvider.Type type){ + public GitProvider getProvider(GitProvider.Type type) { if (type == GitProvider.Type.EXPECTED) { return GitProvider.CI_PROVIDER_EXPECTED; } else { 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 1380cd1cf82..740021149c7 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 @@ -15,6 +15,8 @@ import datadog.trace.api.civisibility.telemetry.tag.FailFastTestOrderEnabled; import datadog.trace.api.civisibility.telemetry.tag.FlakyTestRetriesEnabled; import datadog.trace.api.civisibility.telemetry.tag.GitProvider; +import datadog.trace.api.civisibility.telemetry.tag.GitShaDiscrepancyType; +import datadog.trace.api.civisibility.telemetry.tag.GitShaMatch; import datadog.trace.api.civisibility.telemetry.tag.HasCodeowner; import datadog.trace.api.civisibility.telemetry.tag.HasFailedAllRetries; import datadog.trace.api.civisibility.telemetry.tag.ImpactedTestsDetectionEnabled; @@ -34,8 +36,6 @@ import datadog.trace.api.civisibility.telemetry.tag.RequestCompressed; import datadog.trace.api.civisibility.telemetry.tag.RequireGit; import datadog.trace.api.civisibility.telemetry.tag.RetryReason; -import datadog.trace.api.civisibility.telemetry.tag.GitShaMatch; -import datadog.trace.api.civisibility.telemetry.tag.GitShaDiscrepancyType; import datadog.trace.api.civisibility.telemetry.tag.StatusCode; import datadog.trace.api.civisibility.telemetry.tag.TestFrameworkInstrumentation; import datadog.trace.api.civisibility.telemetry.tag.TestManagementEnabled; @@ -107,7 +107,11 @@ public enum CiVisibilityCountMetric { /** Number of commit sha comparisons and if they matched when building git info for a repo */ GIT_COMMIT_SHA_MATCH("git.commit_sha_match", GitShaMatch.class), /** Number of sha mismatches when building git info for a repo */ - GIT_COMMIT_SHA_DISCREPANCY("git.commit_sha_discrepancy", GitProvider.class, GitProvider.class, GitShaDiscrepancyType.class), + GIT_COMMIT_SHA_DISCREPANCY( + "git.commit_sha_discrepancy", + GitProvider.class, + GitProvider.class, + GitShaDiscrepancyType.class), /** The number of requests sent to the search commit endpoint */ GIT_REQUESTS_SEARCH_COMMITS("git_requests.search_commits", RequestCompressed.class), /** The number of search commit requests sent to the endpoint that errored */ diff --git a/internal-api/src/main/java/datadog/trace/api/civisibility/telemetry/tag/GitProvider.java b/internal-api/src/main/java/datadog/trace/api/civisibility/telemetry/tag/GitProvider.java index 675b5dafe7b..62ebc5c3f72 100644 --- a/internal-api/src/main/java/datadog/trace/api/civisibility/telemetry/tag/GitProvider.java +++ b/internal-api/src/main/java/datadog/trace/api/civisibility/telemetry/tag/GitProvider.java @@ -32,7 +32,11 @@ public String asString() { } private enum Source { - USER_SUPPLIED, CI_PROVIDER, LOCAL_GIT, GIT_CLIENT, EMBEDDED; + USER_SUPPLIED, + CI_PROVIDER, + LOCAL_GIT, + GIT_CLIENT, + EMBEDDED; } public enum Type { 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 c272c61140e..4ae17716df9 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 @@ -92,7 +92,7 @@ public int order() { } @Override - public GitProvider getProvider(GitProvider.Type type){ + public GitProvider getProvider(GitProvider.Type type) { if (type == GitProvider.Type.EXPECTED) { return GitProvider.EMBEDDED_EXPECTED; } else { 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 67eb13b66be..5e18f8a7f49 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 @@ -109,7 +109,7 @@ public int order() { } @Override - public GitProvider getProvider(GitProvider.Type type){ + public GitProvider getProvider(GitProvider.Type type) { if (type == GitProvider.Type.EXPECTED) { return GitProvider.USER_SUPPLIED_EXPECTED; } else { From 8a4f7234c6679165f8a49e5892fb1fa98c06cf40 Mon Sep 17 00:00:00 2001 From: Daniel Mohedano Date: Mon, 5 May 2025 15:48:26 +0200 Subject: [PATCH 4/6] reverted back to separate tag enums for git providers --- .../git/CILocalGitInfoBuilder.java | 16 +++--- .../git/CIProviderGitInfoBuilder.java | 16 +++--- .../git/GitClientGitInfoBuilder.java | 16 +++--- internal-api/build.gradle | 1 + .../telemetry/CiVisibilityCountMetric.java | 7 ++- .../telemetry/tag/GitProvider.java | 56 ------------------- .../telemetry/tag/GitProviderDiscrepant.java | 18 ++++++ .../telemetry/tag/GitProviderExpected.java | 18 ++++++ .../telemetry/tag/GitShaDiscrepancyType.java | 8 +-- .../telemetry/tag/GitShaMatch.java | 8 +-- .../trace/api/git/EmbeddedGitInfoBuilder.java | 16 +++--- .../datadog/trace/api/git/GitInfoBuilder.java | 7 ++- .../trace/api/git/GitInfoProvider.java | 39 +++++++------ .../api/git/UserSuppliedGitInfoBuilder.java | 16 +++--- 14 files changed, 116 insertions(+), 126 deletions(-) delete mode 100644 internal-api/src/main/java/datadog/trace/api/civisibility/telemetry/tag/GitProvider.java create mode 100644 internal-api/src/main/java/datadog/trace/api/civisibility/telemetry/tag/GitProviderDiscrepant.java create mode 100644 internal-api/src/main/java/datadog/trace/api/civisibility/telemetry/tag/GitProviderExpected.java diff --git a/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/git/CILocalGitInfoBuilder.java b/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/git/CILocalGitInfoBuilder.java index 6a367cbbff0..8c2a73ff31d 100644 --- a/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/git/CILocalGitInfoBuilder.java +++ b/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/git/CILocalGitInfoBuilder.java @@ -1,6 +1,7 @@ package datadog.trace.civisibility.git; -import datadog.trace.api.civisibility.telemetry.tag.GitProvider; +import datadog.trace.api.civisibility.telemetry.tag.GitProviderDiscrepant; +import datadog.trace.api.civisibility.telemetry.tag.GitProviderExpected; import datadog.trace.api.git.GitInfo; import datadog.trace.api.git.GitInfoBuilder; import datadog.trace.civisibility.git.tree.GitClient; @@ -57,11 +58,12 @@ public int order() { } @Override - public GitProvider getProvider(GitProvider.Type type) { - if (type == GitProvider.Type.EXPECTED) { - return GitProvider.LOCAL_GIT_EXPECTED; - } else { - return GitProvider.LOCAL_GIT_DISCREPANT; - } + public GitProviderExpected providerAsExpected() { + return GitProviderExpected.LOCAL_GIT; + } + + @Override + public GitProviderDiscrepant providerAsDiscrepant() { + return GitProviderDiscrepant.LOCAL_GIT; } } diff --git a/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/git/CIProviderGitInfoBuilder.java b/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/git/CIProviderGitInfoBuilder.java index e75e83e4ecc..cf4d60ce8cf 100644 --- a/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/git/CIProviderGitInfoBuilder.java +++ b/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/git/CIProviderGitInfoBuilder.java @@ -1,7 +1,8 @@ package datadog.trace.civisibility.git; import datadog.trace.api.Config; -import datadog.trace.api.civisibility.telemetry.tag.GitProvider; +import datadog.trace.api.civisibility.telemetry.tag.GitProviderDiscrepant; +import datadog.trace.api.civisibility.telemetry.tag.GitProviderExpected; import datadog.trace.api.git.GitInfo; import datadog.trace.api.git.GitInfoBuilder; import datadog.trace.civisibility.ci.CIProviderInfo; @@ -35,11 +36,12 @@ public int order() { } @Override - public GitProvider getProvider(GitProvider.Type type) { - if (type == GitProvider.Type.EXPECTED) { - return GitProvider.CI_PROVIDER_EXPECTED; - } else { - return GitProvider.CI_PROVIDER_DISCREPANT; - } + public GitProviderExpected providerAsExpected() { + return GitProviderExpected.CI_PROVIDER; + } + + @Override + public GitProviderDiscrepant providerAsDiscrepant() { + return GitProviderDiscrepant.CI_PROVIDER; } } diff --git a/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/git/GitClientGitInfoBuilder.java b/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/git/GitClientGitInfoBuilder.java index deaad6faae8..7553cf40318 100644 --- a/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/git/GitClientGitInfoBuilder.java +++ b/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/git/GitClientGitInfoBuilder.java @@ -1,7 +1,8 @@ package datadog.trace.civisibility.git; import datadog.trace.api.Config; -import datadog.trace.api.civisibility.telemetry.tag.GitProvider; +import datadog.trace.api.civisibility.telemetry.tag.GitProviderDiscrepant; +import datadog.trace.api.civisibility.telemetry.tag.GitProviderExpected; import datadog.trace.api.git.CommitInfo; import datadog.trace.api.git.GitInfo; import datadog.trace.api.git.GitInfoBuilder; @@ -67,11 +68,12 @@ public int order() { } @Override - public GitProvider getProvider(GitProvider.Type type) { - if (type == GitProvider.Type.EXPECTED) { - return GitProvider.GIT_CLIENT_EXPECTED; - } else { - return GitProvider.GIT_CLIENT_DISCREPANT; - } + public GitProviderExpected providerAsExpected() { + return GitProviderExpected.GIT_CLIENT; + } + + @Override + public GitProviderDiscrepant providerAsDiscrepant() { + return GitProviderDiscrepant.GIT_CLIENT; } } diff --git a/internal-api/build.gradle b/internal-api/build.gradle index dd5ee2ce0cc..d137456f9fe 100644 --- a/internal-api/build.gradle +++ b/internal-api/build.gradle @@ -139,6 +139,7 @@ excludedClassesCoverage += [ // POJO "datadog.trace.api.git.GitInfo", "datadog.trace.api.git.GitInfoProvider", + "datadog.trace.api.git.GitInfoProvider.ShaDiscrepancy", // POJO "datadog.trace.api.git.PersonInfo", // POJO 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 740021149c7..2d8de535abe 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 @@ -14,7 +14,8 @@ import datadog.trace.api.civisibility.telemetry.tag.ExitCode; import datadog.trace.api.civisibility.telemetry.tag.FailFastTestOrderEnabled; import datadog.trace.api.civisibility.telemetry.tag.FlakyTestRetriesEnabled; -import datadog.trace.api.civisibility.telemetry.tag.GitProvider; +import datadog.trace.api.civisibility.telemetry.tag.GitProviderDiscrepant; +import datadog.trace.api.civisibility.telemetry.tag.GitProviderExpected; import datadog.trace.api.civisibility.telemetry.tag.GitShaDiscrepancyType; import datadog.trace.api.civisibility.telemetry.tag.GitShaMatch; import datadog.trace.api.civisibility.telemetry.tag.HasCodeowner; @@ -109,8 +110,8 @@ public enum CiVisibilityCountMetric { /** Number of sha mismatches when building git info for a repo */ GIT_COMMIT_SHA_DISCREPANCY( "git.commit_sha_discrepancy", - GitProvider.class, - GitProvider.class, + GitProviderExpected.class, + GitProviderDiscrepant.class, GitShaDiscrepancyType.class), /** The number of requests sent to the search commit endpoint */ GIT_REQUESTS_SEARCH_COMMITS("git_requests.search_commits", RequestCompressed.class), diff --git a/internal-api/src/main/java/datadog/trace/api/civisibility/telemetry/tag/GitProvider.java b/internal-api/src/main/java/datadog/trace/api/civisibility/telemetry/tag/GitProvider.java deleted file mode 100644 index 62ebc5c3f72..00000000000 --- a/internal-api/src/main/java/datadog/trace/api/civisibility/telemetry/tag/GitProvider.java +++ /dev/null @@ -1,56 +0,0 @@ -package datadog.trace.api.civisibility.telemetry.tag; - -import datadog.trace.api.civisibility.telemetry.TagValue; - -public enum GitProvider implements TagValue { - USER_SUPPLIED_EXPECTED(Type.EXPECTED, Source.USER_SUPPLIED), - USER_SUPPLIED_DISCREPANT(Type.DISCREPANT, Source.USER_SUPPLIED), - - CI_PROVIDER_EXPECTED(Type.EXPECTED, Source.CI_PROVIDER), - CI_PROVIDER_DISCREPANT(Type.DISCREPANT, Source.CI_PROVIDER), - - LOCAL_GIT_EXPECTED(Type.EXPECTED, Source.LOCAL_GIT), - LOCAL_GIT_DISCREPANT(Type.DISCREPANT, Source.LOCAL_GIT), - - GIT_CLIENT_EXPECTED(Type.EXPECTED, Source.GIT_CLIENT), - GIT_CLIENT_DISCREPANT(Type.DISCREPANT, Source.GIT_CLIENT), - - EMBEDDED_EXPECTED(Type.EXPECTED, Source.EMBEDDED), - EMBEDDED_DISCREPANT(Type.DISCREPANT, Source.EMBEDDED); - - private final Type type; - private final Source source; - - GitProvider(Type type, Source source) { - this.type = type; - this.source = source; - } - - @Override - public String asString() { - return type.getTag() + ":" + source.name().toLowerCase(); - } - - private enum Source { - USER_SUPPLIED, - CI_PROVIDER, - LOCAL_GIT, - GIT_CLIENT, - EMBEDDED; - } - - public enum Type { - EXPECTED("expected_provider"), - DISCREPANT("discrepant_provider"); - - private final String tag; - - Type(String tag) { - this.tag = tag; - } - - public String getTag() { - return tag; - } - } -} diff --git a/internal-api/src/main/java/datadog/trace/api/civisibility/telemetry/tag/GitProviderDiscrepant.java b/internal-api/src/main/java/datadog/trace/api/civisibility/telemetry/tag/GitProviderDiscrepant.java new file mode 100644 index 00000000000..3c677fc774e --- /dev/null +++ b/internal-api/src/main/java/datadog/trace/api/civisibility/telemetry/tag/GitProviderDiscrepant.java @@ -0,0 +1,18 @@ +package datadog.trace.api.civisibility.telemetry.tag; + +import datadog.trace.api.civisibility.telemetry.TagValue; + +public enum GitProviderDiscrepant implements TagValue { + USER_SUPPLIED, + CI_PROVIDER, + LOCAL_GIT, + GIT_CLIENT, + EMBEDDED; + + GitProviderDiscrepant() {} + + @Override + public String asString() { + return "discrepant_provider:" + name().toLowerCase(); + } +} diff --git a/internal-api/src/main/java/datadog/trace/api/civisibility/telemetry/tag/GitProviderExpected.java b/internal-api/src/main/java/datadog/trace/api/civisibility/telemetry/tag/GitProviderExpected.java new file mode 100644 index 00000000000..6ec9dcae320 --- /dev/null +++ b/internal-api/src/main/java/datadog/trace/api/civisibility/telemetry/tag/GitProviderExpected.java @@ -0,0 +1,18 @@ +package datadog.trace.api.civisibility.telemetry.tag; + +import datadog.trace.api.civisibility.telemetry.TagValue; + +public enum GitProviderExpected implements TagValue { + USER_SUPPLIED, + CI_PROVIDER, + LOCAL_GIT, + GIT_CLIENT, + EMBEDDED; + + GitProviderExpected() {} + + @Override + public String asString() { + return "expected_provider:" + name().toLowerCase(); + } +} diff --git a/internal-api/src/main/java/datadog/trace/api/civisibility/telemetry/tag/GitShaDiscrepancyType.java b/internal-api/src/main/java/datadog/trace/api/civisibility/telemetry/tag/GitShaDiscrepancyType.java index 176274c66c3..97d75ecca70 100644 --- a/internal-api/src/main/java/datadog/trace/api/civisibility/telemetry/tag/GitShaDiscrepancyType.java +++ b/internal-api/src/main/java/datadog/trace/api/civisibility/telemetry/tag/GitShaDiscrepancyType.java @@ -6,14 +6,10 @@ public enum GitShaDiscrepancyType implements TagValue { REPOSITORY_DISCREPANCY, COMMIT_DISCREPANCY; - private final String s; - - GitShaDiscrepancyType() { - s = "type:" + name().toLowerCase(); - } + GitShaDiscrepancyType() {} @Override public String asString() { - return s; + return "type:" + name().toLowerCase(); } } diff --git a/internal-api/src/main/java/datadog/trace/api/civisibility/telemetry/tag/GitShaMatch.java b/internal-api/src/main/java/datadog/trace/api/civisibility/telemetry/tag/GitShaMatch.java index 45024a9ed4d..ffd3f338bf2 100644 --- a/internal-api/src/main/java/datadog/trace/api/civisibility/telemetry/tag/GitShaMatch.java +++ b/internal-api/src/main/java/datadog/trace/api/civisibility/telemetry/tag/GitShaMatch.java @@ -6,14 +6,10 @@ public enum GitShaMatch implements TagValue { TRUE, FALSE; - private final String s; - - GitShaMatch() { - s = "matched:" + name().toLowerCase(); - } + GitShaMatch() {} @Override public String asString() { - return s; + return "matched:" + name().toLowerCase(); } } 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 4ae17716df9..5b0c71ce149 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 @@ -1,6 +1,7 @@ package datadog.trace.api.git; -import datadog.trace.api.civisibility.telemetry.tag.GitProvider; +import datadog.trace.api.civisibility.telemetry.tag.GitProviderDiscrepant; +import datadog.trace.api.civisibility.telemetry.tag.GitProviderExpected; import java.io.IOException; import java.io.InputStream; import java.util.Arrays; @@ -92,11 +93,12 @@ public int order() { } @Override - public GitProvider getProvider(GitProvider.Type type) { - if (type == GitProvider.Type.EXPECTED) { - return GitProvider.EMBEDDED_EXPECTED; - } else { - return GitProvider.EMBEDDED_DISCREPANT; - } + public GitProviderExpected providerAsExpected() { + return GitProviderExpected.EMBEDDED; + } + + @Override + public GitProviderDiscrepant providerAsDiscrepant() { + return GitProviderDiscrepant.EMBEDDED; } } diff --git a/internal-api/src/main/java/datadog/trace/api/git/GitInfoBuilder.java b/internal-api/src/main/java/datadog/trace/api/git/GitInfoBuilder.java index df3143b6b85..a5ca88d53f3 100644 --- a/internal-api/src/main/java/datadog/trace/api/git/GitInfoBuilder.java +++ b/internal-api/src/main/java/datadog/trace/api/git/GitInfoBuilder.java @@ -1,6 +1,7 @@ package datadog.trace.api.git; -import datadog.trace.api.civisibility.telemetry.tag.GitProvider; +import datadog.trace.api.civisibility.telemetry.tag.GitProviderDiscrepant; +import datadog.trace.api.civisibility.telemetry.tag.GitProviderExpected; import javax.annotation.Nullable; public interface GitInfoBuilder { @@ -8,5 +9,7 @@ public interface GitInfoBuilder { int order(); - GitProvider getProvider(GitProvider.Type type); + GitProviderExpected providerAsExpected(); + + GitProviderDiscrepant providerAsDiscrepant(); } 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 89af168c60f..1eb767d33c3 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 @@ -4,7 +4,8 @@ import datadog.trace.api.cache.DDCaches; import datadog.trace.api.civisibility.InstrumentationBridge; import datadog.trace.api.civisibility.telemetry.CiVisibilityCountMetric; -import datadog.trace.api.civisibility.telemetry.tag.GitProvider; +import datadog.trace.api.civisibility.telemetry.tag.GitProviderDiscrepant; +import datadog.trace.api.civisibility.telemetry.tag.GitProviderExpected; import datadog.trace.api.civisibility.telemetry.tag.GitShaDiscrepancyType; import datadog.trace.api.civisibility.telemetry.tag.GitShaMatch; import datadog.trace.util.Strings; @@ -103,13 +104,13 @@ private static boolean validateGitRemoteUrl(String s) { } private static final class ShaDiscrepancy { - private final GitProvider expectedGitProvider; - private final GitProvider discrepantGitProvider; + private final GitProviderExpected expectedGitProvider; + private final GitProviderDiscrepant discrepantGitProvider; private final GitShaDiscrepancyType discrepancyType; private ShaDiscrepancy( - GitProvider expectedGitProvider, - GitProvider discrepantGitProvider, + GitProviderExpected expectedGitProvider, + GitProviderDiscrepant discrepantGitProvider, GitShaDiscrepancyType discrepancyType) { this.expectedGitProvider = expectedGitProvider; this.discrepantGitProvider = discrepantGitProvider; @@ -183,9 +184,9 @@ private String get( Function function, Predicate validator, boolean checkShaIntegrity) { - String commitSha = null; - String repositoryURL = null; - GitProvider commitShaProvider = null; + String expectedCommitSha = null; + String expectedRepoUrl = null; + GitProviderExpected expectedGitProvider = null; for (Map.Entry e : infos.entrySet()) { GitInfo info = e.getValue(); @@ -199,20 +200,22 @@ private String get( CommitInfo currentCommit = info.getCommit(); String currentCommitSha = currentCommit != null ? currentCommit.getSha() : null; if (Strings.isNotBlank(currentCommitSha)) { - if (commitSha == null) { - commitSha = currentCommitSha; - repositoryURL = info.getRepositoryURL(); - commitShaProvider = e.getKey().getProvider(GitProvider.Type.EXPECTED); - } else if (!commitSha.equals(currentCommitSha)) { + if (expectedCommitSha == null) { + expectedCommitSha = currentCommitSha; + expectedRepoUrl = info.getRepositoryURL(); + expectedGitProvider = e.getKey().providerAsExpected(); + } else if (!expectedCommitSha.equals(currentCommitSha)) { // We already have a commit SHA from source that has higher priority. // Commit SHA from current source is different, so we have to skip it + GitShaDiscrepancyType discrepancyType = GitShaDiscrepancyType.COMMIT_DISCREPANCY; + String repoUrl = info.getRepositoryURL(); + if (expectedRepoUrl != null && repoUrl != null && !repoUrl.equals(expectedRepoUrl)) { + discrepancyType = GitShaDiscrepancyType.REPOSITORY_DISCREPANCY; + } + shaDiscrepancies.add( new ShaDiscrepancy( - commitShaProvider, - e.getKey().getProvider(GitProvider.Type.DISCREPANT), - repositoryURL.equals(info.getRepositoryURL()) - ? GitShaDiscrepancyType.COMMIT_DISCREPANCY - : GitShaDiscrepancyType.REPOSITORY_DISCREPANCY)); + expectedGitProvider, e.getKey().providerAsDiscrepant(), discrepancyType)); continue; } } 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 5e18f8a7f49..215e439562b 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 @@ -1,7 +1,8 @@ package datadog.trace.api.git; import datadog.trace.api.Config; -import datadog.trace.api.civisibility.telemetry.tag.GitProvider; +import datadog.trace.api.civisibility.telemetry.tag.GitProviderDiscrepant; +import datadog.trace.api.civisibility.telemetry.tag.GitProviderExpected; import datadog.trace.api.config.GeneralConfig; import datadog.trace.bootstrap.config.provider.ConfigProvider; import datadog.trace.bootstrap.instrumentation.api.Tags; @@ -109,11 +110,12 @@ public int order() { } @Override - public GitProvider getProvider(GitProvider.Type type) { - if (type == GitProvider.Type.EXPECTED) { - return GitProvider.USER_SUPPLIED_EXPECTED; - } else { - return GitProvider.USER_SUPPLIED_DISCREPANT; - } + public GitProviderExpected providerAsExpected() { + return GitProviderExpected.USER_SUPPLIED; + } + + @Override + public GitProviderDiscrepant providerAsDiscrepant() { + return GitProviderDiscrepant.USER_SUPPLIED; } } From a05859bac798b4c06293b87a77af11923cbefcd8 Mon Sep 17 00:00:00 2001 From: Daniel Mohedano Date: Wed, 7 May 2025 11:35:45 +0200 Subject: [PATCH 5/6] pr suggestions --- .../civisibility/telemetry/tag/GitProviderDiscrepant.java | 2 -- .../api/civisibility/telemetry/tag/GitProviderExpected.java | 2 -- .../civisibility/telemetry/tag/GitShaDiscrepancyType.java | 2 -- .../trace/api/civisibility/telemetry/tag/GitShaMatch.java | 2 -- .../src/main/java/datadog/trace/api/git/GitInfoBuilder.java | 6 ++++++ .../groovy/datadog/trace/api/git/GitInfoProviderTest.groovy | 4 ++++ 6 files changed, 10 insertions(+), 8 deletions(-) diff --git a/internal-api/src/main/java/datadog/trace/api/civisibility/telemetry/tag/GitProviderDiscrepant.java b/internal-api/src/main/java/datadog/trace/api/civisibility/telemetry/tag/GitProviderDiscrepant.java index 3c677fc774e..e356805a255 100644 --- a/internal-api/src/main/java/datadog/trace/api/civisibility/telemetry/tag/GitProviderDiscrepant.java +++ b/internal-api/src/main/java/datadog/trace/api/civisibility/telemetry/tag/GitProviderDiscrepant.java @@ -9,8 +9,6 @@ public enum GitProviderDiscrepant implements TagValue { GIT_CLIENT, EMBEDDED; - GitProviderDiscrepant() {} - @Override public String asString() { return "discrepant_provider:" + name().toLowerCase(); diff --git a/internal-api/src/main/java/datadog/trace/api/civisibility/telemetry/tag/GitProviderExpected.java b/internal-api/src/main/java/datadog/trace/api/civisibility/telemetry/tag/GitProviderExpected.java index 6ec9dcae320..cf2c6e5b9f3 100644 --- a/internal-api/src/main/java/datadog/trace/api/civisibility/telemetry/tag/GitProviderExpected.java +++ b/internal-api/src/main/java/datadog/trace/api/civisibility/telemetry/tag/GitProviderExpected.java @@ -9,8 +9,6 @@ public enum GitProviderExpected implements TagValue { GIT_CLIENT, EMBEDDED; - GitProviderExpected() {} - @Override public String asString() { return "expected_provider:" + name().toLowerCase(); diff --git a/internal-api/src/main/java/datadog/trace/api/civisibility/telemetry/tag/GitShaDiscrepancyType.java b/internal-api/src/main/java/datadog/trace/api/civisibility/telemetry/tag/GitShaDiscrepancyType.java index 97d75ecca70..2be69a41e08 100644 --- a/internal-api/src/main/java/datadog/trace/api/civisibility/telemetry/tag/GitShaDiscrepancyType.java +++ b/internal-api/src/main/java/datadog/trace/api/civisibility/telemetry/tag/GitShaDiscrepancyType.java @@ -6,8 +6,6 @@ public enum GitShaDiscrepancyType implements TagValue { REPOSITORY_DISCREPANCY, COMMIT_DISCREPANCY; - GitShaDiscrepancyType() {} - @Override public String asString() { return "type:" + name().toLowerCase(); diff --git a/internal-api/src/main/java/datadog/trace/api/civisibility/telemetry/tag/GitShaMatch.java b/internal-api/src/main/java/datadog/trace/api/civisibility/telemetry/tag/GitShaMatch.java index ffd3f338bf2..f5ea9b9a7f8 100644 --- a/internal-api/src/main/java/datadog/trace/api/civisibility/telemetry/tag/GitShaMatch.java +++ b/internal-api/src/main/java/datadog/trace/api/civisibility/telemetry/tag/GitShaMatch.java @@ -6,8 +6,6 @@ public enum GitShaMatch implements TagValue { TRUE, FALSE; - GitShaMatch() {} - @Override public String asString() { return "matched:" + name().toLowerCase(); diff --git a/internal-api/src/main/java/datadog/trace/api/git/GitInfoBuilder.java b/internal-api/src/main/java/datadog/trace/api/git/GitInfoBuilder.java index a5ca88d53f3..a568a5ade33 100644 --- a/internal-api/src/main/java/datadog/trace/api/git/GitInfoBuilder.java +++ b/internal-api/src/main/java/datadog/trace/api/git/GitInfoBuilder.java @@ -9,6 +9,12 @@ public interface GitInfoBuilder { int order(); + /** + * Used for SHA discrepancies telemetry. Two enums are needed, one for each tag: + * - `expected_provider` + * - `discrepant_provider` + * A provider can act as either of them depending on the discrepancy found. + */ GitProviderExpected providerAsExpected(); GitProviderDiscrepant providerAsDiscrepant(); diff --git a/internal-api/src/test/groovy/datadog/trace/api/git/GitInfoProviderTest.groovy b/internal-api/src/test/groovy/datadog/trace/api/git/GitInfoProviderTest.groovy index 73219b9ba0d..3beee57c83c 100644 --- a/internal-api/src/test/groovy/datadog/trace/api/git/GitInfoProviderTest.groovy +++ b/internal-api/src/test/groovy/datadog/trace/api/git/GitInfoProviderTest.groovy @@ -238,6 +238,10 @@ class GitInfoProviderTest extends Specification { actualGitInfo.commit.committer.iso8601Date == null } + def "test emit telemetry metrics when SHA discrepancies are found"() { + + } + def "test ignores remote URLs starting with file protocol"() { setup: def gitInfoBuilderA = givenABuilderReturning( From 967decc49194d724d995d91e76a352416c890d6d Mon Sep 17 00:00:00 2001 From: Daniel Mohedano Date: Wed, 7 May 2025 14:11:17 +0200 Subject: [PATCH 6/6] sha discrepancy detection unit tests --- .../datadog/trace/api/git/GitInfoBuilder.java | 5 +- .../trace/api/git/GitInfoProviderTest.groovy | 86 ++++++++++++++++++- 2 files changed, 87 insertions(+), 4 deletions(-) diff --git a/internal-api/src/main/java/datadog/trace/api/git/GitInfoBuilder.java b/internal-api/src/main/java/datadog/trace/api/git/GitInfoBuilder.java index a568a5ade33..7deb594d25b 100644 --- a/internal-api/src/main/java/datadog/trace/api/git/GitInfoBuilder.java +++ b/internal-api/src/main/java/datadog/trace/api/git/GitInfoBuilder.java @@ -11,9 +11,8 @@ public interface GitInfoBuilder { /** * Used for SHA discrepancies telemetry. Two enums are needed, one for each tag: - * - `expected_provider` - * - `discrepant_provider` - * A provider can act as either of them depending on the discrepancy found. + * `expected_provider`, `discrepant_provider`. A provider can act as either of them depending on + * the discrepancy found. */ GitProviderExpected providerAsExpected(); diff --git a/internal-api/src/test/groovy/datadog/trace/api/git/GitInfoProviderTest.groovy b/internal-api/src/test/groovy/datadog/trace/api/git/GitInfoProviderTest.groovy index 3beee57c83c..c6177f24901 100644 --- a/internal-api/src/test/groovy/datadog/trace/api/git/GitInfoProviderTest.groovy +++ b/internal-api/src/test/groovy/datadog/trace/api/git/GitInfoProviderTest.groovy @@ -1,5 +1,12 @@ package datadog.trace.api.git +import datadog.trace.api.civisibility.InstrumentationBridge +import datadog.trace.api.civisibility.telemetry.CiVisibilityCountMetric +import datadog.trace.api.civisibility.telemetry.CiVisibilityMetricCollector +import datadog.trace.api.civisibility.telemetry.tag.GitProviderDiscrepant +import datadog.trace.api.civisibility.telemetry.tag.GitProviderExpected +import datadog.trace.api.civisibility.telemetry.tag.GitShaDiscrepancyType +import datadog.trace.api.civisibility.telemetry.tag.GitShaMatch import spock.lang.Specification class GitInfoProviderTest extends Specification { @@ -238,8 +245,79 @@ class GitInfoProviderTest extends Specification { actualGitInfo.commit.committer.iso8601Date == null } - def "test emit telemetry metrics when SHA discrepancies are found"() { + def "test adds correct telemetry metrics when SHA discrepancies are found"() { + setup: + def metricCollector = Mock(CiVisibilityMetricCollector) + InstrumentationBridge.registerMetricCollector(metricCollector) + + def gitInfoA = new GitInfo("repoUrlA", null, null, + new CommitInfo("shaA", + PersonInfo.NOOP, + PersonInfo.NOOP, + "message" + )) + def gitInfoB = new GitInfo("repoUrlA", null, null, + new CommitInfo("shaB", + new PersonInfo("author name", "author email", "author date"), + new PersonInfo("committer name", "committer email", "committer date"), + "message" + )) + def gitInfoC = new GitInfo("repoUrlB", null, null, + new CommitInfo("shaC", + new PersonInfo("author name", "author email", "author date"), + new PersonInfo("committer name", "committer email", "committer date"), + "message" + )) + + def gitInfoBuilderA = givenABuilderReturning(gitInfoA, 1, GitProviderExpected.CI_PROVIDER, GitProviderDiscrepant.CI_PROVIDER) + def gitInfoBuilderB = givenABuilderReturning(gitInfoB, 2, GitProviderExpected.LOCAL_GIT, GitProviderDiscrepant.LOCAL_GIT) + def gitInfoBuilderC = givenABuilderReturning(gitInfoC, 3, GitProviderExpected.GIT_CLIENT, GitProviderDiscrepant.GIT_CLIENT) + def gitInfoProvider = new GitInfoProvider() + gitInfoProvider.registerGitInfoBuilder(gitInfoBuilderA) + gitInfoProvider.registerGitInfoBuilder(gitInfoBuilderB) + gitInfoProvider.registerGitInfoBuilder(gitInfoBuilderC) + + when: + gitInfoProvider.getGitInfo(REPO_PATH) + + then: + 1 * metricCollector.add(CiVisibilityCountMetric.GIT_COMMIT_SHA_MATCH, 1, GitShaMatch.FALSE) + 1 * metricCollector.add(CiVisibilityCountMetric.GIT_COMMIT_SHA_DISCREPANCY, 1, GitProviderExpected.CI_PROVIDER, GitProviderDiscrepant.LOCAL_GIT, GitShaDiscrepancyType.COMMIT_DISCREPANCY) + 1 * metricCollector.add(CiVisibilityCountMetric.GIT_COMMIT_SHA_DISCREPANCY, 1, GitProviderExpected.CI_PROVIDER, GitProviderDiscrepant.GIT_CLIENT, GitShaDiscrepancyType.REPOSITORY_DISCREPANCY) + } + + def "test adds correct telemetry metrics when no SHA discrepancies are found"() { + setup: + def metricCollector = Mock(CiVisibilityMetricCollector) + InstrumentationBridge.registerMetricCollector(metricCollector) + + def gitInfoA = new GitInfo("repoUrlA", null, null, + new CommitInfo("shaA", + PersonInfo.NOOP, + PersonInfo.NOOP, + "message" + )) + def gitInfoB = new GitInfo("repoUrlA", null, null, + new CommitInfo("shaA", + new PersonInfo("author name", "author email", "author date"), + new PersonInfo("committer name", "committer email", "committer date"), + "message" + )) + + def gitInfoBuilderA = givenABuilderReturning(gitInfoA, 1, GitProviderExpected.CI_PROVIDER, GitProviderDiscrepant.CI_PROVIDER) + def gitInfoBuilderB = givenABuilderReturning(gitInfoB, 2, GitProviderExpected.LOCAL_GIT, GitProviderDiscrepant.LOCAL_GIT) + + def gitInfoProvider = new GitInfoProvider() + gitInfoProvider.registerGitInfoBuilder(gitInfoBuilderA) + gitInfoProvider.registerGitInfoBuilder(gitInfoBuilderB) + + when: + gitInfoProvider.getGitInfo(REPO_PATH) + + then: + 1 * metricCollector.add(CiVisibilityCountMetric.GIT_COMMIT_SHA_MATCH, 1, GitShaMatch.TRUE) + 0 * metricCollector.add(CiVisibilityCountMetric.GIT_COMMIT_SHA_DISCREPANCY, *_) } def "test ignores remote URLs starting with file protocol"() { @@ -268,9 +346,15 @@ class GitInfoProviderTest extends Specification { } private GitInfoBuilder givenABuilderReturning(GitInfo gitInfo, int order) { + givenABuilderReturning(gitInfo, order, GitProviderExpected.USER_SUPPLIED, GitProviderDiscrepant.USER_SUPPLIED) + } + + private GitInfoBuilder givenABuilderReturning(GitInfo gitInfo, int order, GitProviderExpected expected, GitProviderDiscrepant discrepant) { def gitInfoBuilder = Stub(GitInfoBuilder) gitInfoBuilder.build(REPO_PATH) >> gitInfo gitInfoBuilder.order() >> order + gitInfoBuilder.providerAsExpected() >> expected + gitInfoBuilder.providerAsDiscrepant() >> discrepant gitInfoBuilder } }