From 1321c2606c091d1fd9d0a2ed2d6c5b216c0dd9af Mon Sep 17 00:00:00 2001 From: Nikita Tkachenko Date: Mon, 12 Feb 2024 14:30:33 +0100 Subject: [PATCH] Implement telemetry for shell git commands --- .../agent-ci-visibility/build.gradle | 1 + .../civisibility/CiVisibilityServices.java | 10 +- .../civisibility/CiVisibilitySystem.java | 12 +- .../civisibility/git/tree/GitClient.java | 366 ++++++++++++------ .../utils/ShellCommandExecutor.java | 10 +- .../git/GitClientGitInfoBuilderTest.groovy | 4 +- .../git/tree/GitClientTest.groovy | 4 +- .../git/tree/GitDataUploaderImplTest.groovy | 5 +- 8 files changed, 278 insertions(+), 134 deletions(-) diff --git a/dd-java-agent/agent-ci-visibility/build.gradle b/dd-java-agent/agent-ci-visibility/build.gradle index b264d7033a3..1f3c4866ff3 100644 --- a/dd-java-agent/agent-ci-visibility/build.gradle +++ b/dd-java-agent/agent-ci-visibility/build.gradle @@ -91,6 +91,7 @@ excludedClassesCoverage += [ "datadog.trace.civisibility.utils.ProcessHierarchyUtils", "datadog.trace.civisibility.utils.ShellCommandExecutor", "datadog.trace.civisibility.utils.ShellCommandExecutor.OutputParser", + "datadog.trace.civisibility.utils.ShellCommandExecutor.ShellCommandFailedException", "datadog.trace.civisibility.utils.SpanUtils" ] diff --git a/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/CiVisibilityServices.java b/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/CiVisibilityServices.java index aa8e27f02d1..df04179a883 100644 --- a/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/CiVisibilityServices.java +++ b/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/CiVisibilityServices.java @@ -2,6 +2,7 @@ import datadog.communication.ddagent.SharedCommunicationObjects; import datadog.trace.api.Config; +import datadog.trace.api.civisibility.telemetry.CiVisibilityMetricCollector; import datadog.trace.api.git.GitInfoProvider; import datadog.trace.civisibility.ci.CIProviderInfoFactory; import datadog.trace.civisibility.communication.BackendApi; @@ -42,6 +43,7 @@ public class CiVisibilityServices { private static final String GIT_FOLDER_NAME = ".git"; final Config config; + final CiVisibilityMetricCollector metricCollector; final BackendApi backendApi; final JvmInfoFactory jvmInfoFactory; final CIProviderInfoFactory ciProviderInfoFactory; @@ -53,11 +55,15 @@ public class CiVisibilityServices { @Nullable final SignalClient.Factory signalClientFactory; CiVisibilityServices( - Config config, SharedCommunicationObjects sco, GitInfoProvider gitInfoProvider) { + Config config, + CiVisibilityMetricCollector metricCollector, + SharedCommunicationObjects sco, + GitInfoProvider gitInfoProvider) { this.config = config; + this.metricCollector = metricCollector; this.backendApi = new BackendApiFactory(config, sco).createBackendApi(); this.jvmInfoFactory = new CachingJvmInfoFactory(config, new JvmInfoFactoryImpl()); - this.gitClientFactory = new GitClient.Factory(config); + this.gitClientFactory = new GitClient.Factory(config, metricCollector); this.ciProviderInfoFactory = new CIProviderInfoFactory(config); this.methodLinesResolver = new BestEffortMethodLinesResolver( 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 6ac487134d2..c25c4de9b25 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 @@ -10,6 +10,8 @@ import datadog.trace.api.civisibility.coverage.CoverageDataSupplier; import datadog.trace.api.civisibility.events.BuildEventsHandler; import datadog.trace.api.civisibility.events.TestEventsHandler; +import datadog.trace.api.civisibility.telemetry.CiVisibilityMetricCollector; +import datadog.trace.api.civisibility.telemetry.NoOpMetricCollector; import datadog.trace.api.git.GitInfoProvider; import datadog.trace.civisibility.config.JvmInfo; import datadog.trace.civisibility.coverage.instrumentation.CoverageClassTransformer; @@ -19,6 +21,7 @@ import datadog.trace.civisibility.events.BuildEventsHandlerImpl; import datadog.trace.civisibility.events.TestEventsHandlerImpl; import datadog.trace.civisibility.ipc.SignalServer; +import datadog.trace.civisibility.telemetry.CiVisibilityMetricCollectorImpl; import datadog.trace.civisibility.utils.ProcessHierarchyUtils; import datadog.trace.util.throwable.FatalAgentMisconfigurationError; import java.lang.instrument.Instrumentation; @@ -53,7 +56,14 @@ public static void start(Instrumentation inst, SharedCommunicationObjects sco) { sco.createRemaining(config); - CiVisibilityServices services = new CiVisibilityServices(config, sco, GitInfoProvider.INSTANCE); + CiVisibilityMetricCollector metricCollector = + config.isCiVisibilityTelemetryEnabled() + ? new CiVisibilityMetricCollectorImpl() + : NoOpMetricCollector.INSTANCE; + InstrumentationBridge.registerMetricCollector(metricCollector); + + CiVisibilityServices services = + new CiVisibilityServices(config, metricCollector, sco, GitInfoProvider.INSTANCE); InstrumentationBridge.registerBuildEventsHandlerFactory(buildEventsHandlerFactory(services)); CIVisibility.registerSessionFactory(apiSessionFactory(services)); 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 c42ee432e89..794c673a73b 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 @@ -1,6 +1,11 @@ package datadog.trace.civisibility.git.tree; import datadog.trace.api.Config; +import datadog.trace.api.civisibility.telemetry.CiVisibilityCountMetric; +import datadog.trace.api.civisibility.telemetry.CiVisibilityDistributionMetric; +import datadog.trace.api.civisibility.telemetry.CiVisibilityMetricCollector; +import datadog.trace.api.civisibility.telemetry.tag.Command; +import datadog.trace.api.civisibility.telemetry.tag.ExitCode; import datadog.trace.civisibility.utils.IOUtils; import datadog.trace.civisibility.utils.ShellCommandExecutor; import datadog.trace.util.Strings; @@ -26,6 +31,7 @@ public class GitClient { private static final String DD_TEMP_DIRECTORY_PREFIX = "dd-ci-vis-"; + private final CiVisibilityMetricCollector metricCollector; private final String repoRoot; private final String latestCommitsSince; private final int latestCommitsLimit; @@ -34,6 +40,7 @@ public class GitClient { /** * Creates a new git client * + * @param metricCollector Telemetry metrics collector * @param repoRoot Absolute path to Git repository root * @param latestCommitsSince How far into the past the client should be looking when fetching Git * data, e.g. {@code "1 month ago"} or {@code "2 years ago"} @@ -41,8 +48,13 @@ public class GitClient { * fetching commit data * @param timeoutMillis Timeout in milliseconds that is applied to executed Git commands */ - public GitClient( - String repoRoot, String latestCommitsSince, int latestCommitsLimit, long timeoutMillis) { + GitClient( + CiVisibilityMetricCollector metricCollector, + String repoRoot, + String latestCommitsSince, + int latestCommitsLimit, + long timeoutMillis) { + this.metricCollector = metricCollector; this.repoRoot = repoRoot; this.latestCommitsSince = latestCommitsSince; this.latestCommitsLimit = latestCommitsLimit; @@ -59,11 +71,15 @@ public GitClient( * finish */ public boolean isShallow() throws IOException, TimeoutException, InterruptedException { - String output = - commandExecutor - .executeCommand(IOUtils::readFully, "git", "rev-parse", "--is-shallow-repository") - .trim(); - return Boolean.parseBoolean(output); + return executeCommand( + Command.CHECK_SHALLOW, + () -> { + String output = + commandExecutor + .executeCommand(IOUtils::readFully, "git", "rev-parse", "--is-shallow-repository") + .trim(); + return Boolean.parseBoolean(output); + }); } /** @@ -80,9 +96,12 @@ public boolean isShallow() throws IOException, TimeoutException, InterruptedExce * finish */ public String getUpstreamBranchSha() throws IOException, TimeoutException, InterruptedException { - return commandExecutor - .executeCommand(IOUtils::readFully, "git", "rev-parse", "@{upstream}") - .trim(); + return executeCommand( + Command.OTHER, + () -> + commandExecutor + .executeCommand(IOUtils::readFully, "git", "rev-parse", "@{upstream}") + .trim()); } /** @@ -98,42 +117,48 @@ public String getUpstreamBranchSha() throws IOException, TimeoutException, Inter */ public void unshallow(@Nullable String remoteCommitReference) throws IOException, TimeoutException, InterruptedException { - String remote = - commandExecutor - .executeCommand( - IOUtils::readFully, + executeCommand( + Command.UNSHALLOW, + () -> { + String remote = + commandExecutor + .executeCommand( + IOUtils::readFully, + "git", + "config", + "--default", + "origin", + "--get", + "clone.defaultRemoteName") + .trim(); + + // refetch data from the server for the given period of time + if (remoteCommitReference != null) { + String headSha = getSha(remoteCommitReference); + commandExecutor.executeCommand( + ShellCommandExecutor.OutputParser.IGNORE, "git", - "config", - "--default", - "origin", - "--get", - "clone.defaultRemoteName") - .trim(); - - // refetch data from the server for the given period of time - if (remoteCommitReference != null) { - String headSha = getSha(remoteCommitReference); - commandExecutor.executeCommand( - ShellCommandExecutor.OutputParser.IGNORE, - "git", - "fetch", - String.format("--shallow-since=='%s'", latestCommitsSince), - "--update-shallow", - "--filter=blob:none", - "--recurse-submodules=no", - remote, - headSha); - } else { - commandExecutor.executeCommand( - ShellCommandExecutor.OutputParser.IGNORE, - "git", - "fetch", - String.format("--shallow-since=='%s'", latestCommitsSince), - "--update-shallow", - "--filter=blob:none", - "--recurse-submodules=no", - remote); - } + "fetch", + String.format("--shallow-since=='%s'", latestCommitsSince), + "--update-shallow", + "--filter=blob:none", + "--recurse-submodules=no", + remote, + headSha); + } else { + commandExecutor.executeCommand( + ShellCommandExecutor.OutputParser.IGNORE, + "git", + "fetch", + String.format("--shallow-since=='%s'", latestCommitsSince), + "--update-shallow", + "--filter=blob:none", + "--recurse-submodules=no", + remote); + } + + return (Void) null; + }); } /** @@ -146,9 +171,12 @@ public void unshallow(@Nullable String remoteCommitReference) * finish */ public @NonNull String getGitFolder() throws IOException, TimeoutException, InterruptedException { - return commandExecutor - .executeCommand(IOUtils::readFully, "git", "rev-parse", "--absolute-git-dir") - .trim(); + return executeCommand( + Command.OTHER, + () -> + commandExecutor + .executeCommand(IOUtils::readFully, "git", "rev-parse", "--absolute-git-dir") + .trim()); } /** @@ -163,10 +191,13 @@ public void unshallow(@Nullable String remoteCommitReference) */ public String getRemoteUrl(String remoteName) throws IOException, TimeoutException, InterruptedException { - return commandExecutor - .executeCommand( - IOUtils::readFully, "git", "config", "--get", "remote." + remoteName + ".url") - .trim(); + return executeCommand( + Command.GET_REPOSITORY, + () -> + commandExecutor + .executeCommand( + IOUtils::readFully, "git", "config", "--get", "remote." + remoteName + ".url") + .trim()); } /** @@ -180,9 +211,12 @@ public String getRemoteUrl(String remoteName) */ public @NonNull String getCurrentBranch() throws IOException, TimeoutException, InterruptedException { - return commandExecutor - .executeCommand(IOUtils::readFully, "git", "branch", "--show-current") - .trim(); + return executeCommand( + Command.GET_BRANCH, + () -> + commandExecutor + .executeCommand(IOUtils::readFully, "git", "branch", "--show-current") + .trim()); } /** @@ -197,14 +231,18 @@ public String getRemoteUrl(String remoteName) */ public @NonNull List getTags(String commit) throws IOException, TimeoutException, InterruptedException { - try { - return commandExecutor.executeCommand( - IOUtils::readLines, "git", "describe", "--tags", "--exact-match", commit); - } catch (ShellCommandExecutor.ShellCommandFailedException e) { - // if provided commit is not tagged, - // command will fail because "--exact-match" is specified - return Collections.emptyList(); - } + return executeCommand( + Command.OTHER, + () -> { + try { + return commandExecutor.executeCommand( + IOUtils::readLines, "git", "describe", "--tags", "--exact-match", commit); + } catch (ShellCommandExecutor.ShellCommandFailedException e) { + // if provided commit is not tagged, + // command will fail because "--exact-match" is specified + return Collections.emptyList(); + } + }); } /** @@ -219,7 +257,12 @@ public String getRemoteUrl(String remoteName) */ public @NonNull String getSha(String reference) throws IOException, TimeoutException, InterruptedException { - return commandExecutor.executeCommand(IOUtils::readFully, "git", "rev-parse", reference).trim(); + return executeCommand( + Command.OTHER, + () -> + commandExecutor + .executeCommand(IOUtils::readFully, "git", "rev-parse", reference) + .trim()); } /** @@ -234,9 +277,12 @@ public String getRemoteUrl(String remoteName) */ public @NonNull String getFullMessage(String commit) throws IOException, TimeoutException, InterruptedException { - return commandExecutor - .executeCommand(IOUtils::readFully, "git", "log", "-n", "1", "--format=%B", commit) - .trim(); + return executeCommand( + Command.OTHER, + () -> + commandExecutor + .executeCommand(IOUtils::readFully, "git", "log", "-n", "1", "--format=%B", commit) + .trim()); } /** @@ -251,9 +297,12 @@ public String getRemoteUrl(String remoteName) */ public @NonNull String getAuthorName(String commit) throws IOException, TimeoutException, InterruptedException { - return commandExecutor - .executeCommand(IOUtils::readFully, "git", "log", "-n", "1", "--format=%an", commit) - .trim(); + return executeCommand( + Command.OTHER, + () -> + commandExecutor + .executeCommand(IOUtils::readFully, "git", "log", "-n", "1", "--format=%an", commit) + .trim()); } /** @@ -268,9 +317,12 @@ public String getRemoteUrl(String remoteName) */ public @NonNull String getAuthorEmail(String commit) throws IOException, TimeoutException, InterruptedException { - return commandExecutor - .executeCommand(IOUtils::readFully, "git", "log", "-n", "1", "--format=%ae", commit) - .trim(); + return executeCommand( + Command.OTHER, + () -> + commandExecutor + .executeCommand(IOUtils::readFully, "git", "log", "-n", "1", "--format=%ae", commit) + .trim()); } /** @@ -285,9 +337,12 @@ public String getRemoteUrl(String remoteName) */ public @NonNull String getAuthorDate(String commit) throws IOException, TimeoutException, InterruptedException { - return commandExecutor - .executeCommand(IOUtils::readFully, "git", "log", "-n", "1", "--format=%aI", commit) - .trim(); + return executeCommand( + Command.OTHER, + () -> + commandExecutor + .executeCommand(IOUtils::readFully, "git", "log", "-n", "1", "--format=%aI", commit) + .trim()); } /** @@ -302,9 +357,12 @@ public String getRemoteUrl(String remoteName) */ public @NonNull String getCommitterName(String commit) throws IOException, TimeoutException, InterruptedException { - return commandExecutor - .executeCommand(IOUtils::readFully, "git", "log", "-n", "1", "--format=%cn", commit) - .trim(); + return executeCommand( + Command.OTHER, + () -> + commandExecutor + .executeCommand(IOUtils::readFully, "git", "log", "-n", "1", "--format=%cn", commit) + .trim()); } /** @@ -319,9 +377,12 @@ public String getRemoteUrl(String remoteName) */ public @NonNull String getCommitterEmail(String commit) throws IOException, TimeoutException, InterruptedException { - return commandExecutor - .executeCommand(IOUtils::readFully, "git", "log", "-n", "1", "--format=%ce", commit) - .trim(); + return executeCommand( + Command.OTHER, + () -> + commandExecutor + .executeCommand(IOUtils::readFully, "git", "log", "-n", "1", "--format=%ce", commit) + .trim()); } /** @@ -336,9 +397,12 @@ public String getRemoteUrl(String remoteName) */ public @NonNull String getCommitterDate(String commit) throws IOException, TimeoutException, InterruptedException { - return commandExecutor - .executeCommand(IOUtils::readFully, "git", "log", "-n", "1", "--format=%cI", commit) - .trim(); + return executeCommand( + Command.OTHER, + () -> + commandExecutor + .executeCommand(IOUtils::readFully, "git", "log", "-n", "1", "--format=%cI", commit) + .trim()); } /** @@ -353,14 +417,17 @@ public String getRemoteUrl(String remoteName) */ public List getLatestCommits() throws IOException, TimeoutException, InterruptedException { - return commandExecutor.executeCommand( - IOUtils::readLines, - "git", - "log", - "--format=%H", - "-n", - String.valueOf(latestCommitsLimit), - String.format("--since='%s'", latestCommitsSince)); + return executeCommand( + Command.GET_LOCAL_COMMITS, + () -> + commandExecutor.executeCommand( + IOUtils::readLines, + "git", + "log", + "--format=%H", + "-n", + String.valueOf(latestCommitsLimit), + String.format("--since='%s'", latestCommitsSince))); } /** @@ -378,23 +445,27 @@ public List getLatestCommits() public List getObjects( Collection commitsToSkip, Collection commitsToInclude) throws IOException, TimeoutException, InterruptedException { - String[] command = new String[6 + commitsToSkip.size() + commitsToInclude.size()]; - command[0] = "git"; - command[1] = "rev-list"; - command[2] = "--objects"; - command[3] = "--no-object-names"; - command[4] = "--filter=blob:none"; - command[5] = String.format("--since='%s'", latestCommitsSince); - - int count = 6; - for (String commitToSkip : commitsToSkip) { - command[count++] = "^" + commitToSkip; - } - for (String commitToInclude : commitsToInclude) { - command[count++] = commitToInclude; - } - - return commandExecutor.executeCommand(IOUtils::readLines, command); + return executeCommand( + Command.GET_OBJECTS, + () -> { + String[] command = new String[6 + commitsToSkip.size() + commitsToInclude.size()]; + command[0] = "git"; + command[1] = "rev-list"; + command[2] = "--objects"; + command[3] = "--no-object-names"; + command[4] = "--filter=blob:none"; + command[5] = String.format("--since='%s'", latestCommitsSince); + + int count = 6; + for (String commitToSkip : commitsToSkip) { + command[count++] = "^" + commitToSkip; + } + for (String commitToInclude : commitsToInclude) { + command[count++] = commitToInclude; + } + + return commandExecutor.executeCommand(IOUtils::readLines, command); + }); } /** @@ -410,21 +481,25 @@ public List getObjects( */ public Path createPackFiles(List objectHashes) throws IOException, TimeoutException, InterruptedException { - byte[] input = Strings.join("\n", objectHashes).getBytes(Charset.defaultCharset()); - - Path tempDirectory = createTempDirectory(); - String basename = Strings.random(8); - String path = tempDirectory.toString() + File.separator + basename; - - commandExecutor.executeCommand( - ShellCommandExecutor.OutputParser.IGNORE, - input, - "git", - "pack-objects", - "--compression=9", - "--max-pack-size=3m", - path); - return tempDirectory; + return executeCommand( + Command.PACK_OBJECTS, + () -> { + byte[] input = Strings.join("\n", objectHashes).getBytes(Charset.defaultCharset()); + + Path tempDirectory = createTempDirectory(); + String basename = Strings.random(8); + String path = tempDirectory.toString() + File.separator + basename; + + commandExecutor.executeCommand( + ShellCommandExecutor.OutputParser.IGNORE, + input, + "git", + "pack-objects", + "--compression=9", + "--max-pack-size=3m", + path); + return tempDirectory; + }); } private Path createTempDirectory() throws IOException { @@ -450,16 +525,53 @@ public String toString() { return "GitClient{" + repoRoot + "}"; } + private interface GitCommand { + T execute() throws IOException, TimeoutException, InterruptedException; + } + + private T executeCommand(Command commandType, GitCommand command) + throws IOException, TimeoutException, InterruptedException { + long startTime = System.currentTimeMillis(); + try { + return command.execute(); + + } catch (IOException | TimeoutException | InterruptedException e) { + metricCollector.add( + CiVisibilityCountMetric.GIT_COMMAND_ERRORS, 1, commandType, getExitCode(e)); + throw e; + + } finally { + metricCollector.add(CiVisibilityCountMetric.GIT_COMMAND, 1, commandType); + metricCollector.add( + CiVisibilityDistributionMetric.GIT_COMMAND_MS, + (int) (System.currentTimeMillis() - startTime), + commandType); + } + } + + private static ExitCode getExitCode(Exception e) { + if (e instanceof ShellCommandExecutor.ShellCommandFailedException) { + ShellCommandExecutor.ShellCommandFailedException scfe = + (ShellCommandExecutor.ShellCommandFailedException) e; + return ExitCode.from(scfe.getExitCode()); + + } else { + return ExitCode.CODE_UNKNOWN; + } + } + public static class Factory { private final Config config; + private final CiVisibilityMetricCollector metricCollector; - public Factory(Config config) { + public Factory(Config config, CiVisibilityMetricCollector metricCollector) { this.config = config; + this.metricCollector = metricCollector; } public GitClient create(String repoRoot) { long commandTimeoutMillis = config.getCiVisibilityGitCommandTimeoutMillis(); - return new GitClient(repoRoot, "1 month ago", 1000, commandTimeoutMillis); + return new GitClient(metricCollector, repoRoot, "1 month ago", 1000, commandTimeoutMillis); } } } diff --git a/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/utils/ShellCommandExecutor.java b/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/utils/ShellCommandExecutor.java index 640752096d2..88699971508 100644 --- a/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/utils/ShellCommandExecutor.java +++ b/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/utils/ShellCommandExecutor.java @@ -116,6 +116,7 @@ private T executeCommand( int exitValue = p.exitValue(); if (exitValue != 0) { throw new ShellCommandFailedException( + exitValue, "Command '" + Strings.join(" ", command) + "' failed with exit code " @@ -195,8 +196,15 @@ public interface OutputParser { } public static final class ShellCommandFailedException extends IOException { - public ShellCommandFailedException(String message) { + private final int exitCode; + + public ShellCommandFailedException(int exitCode, String message) { super(message); + this.exitCode = exitCode; + } + + public int getExitCode() { + return exitCode; } } } diff --git a/dd-java-agent/agent-ci-visibility/src/test/groovy/datadog/trace/civisibility/git/GitClientGitInfoBuilderTest.groovy b/dd-java-agent/agent-ci-visibility/src/test/groovy/datadog/trace/civisibility/git/GitClientGitInfoBuilderTest.groovy index d9b1cf143fa..0d03e2434d0 100644 --- a/dd-java-agent/agent-ci-visibility/src/test/groovy/datadog/trace/civisibility/git/GitClientGitInfoBuilderTest.groovy +++ b/dd-java-agent/agent-ci-visibility/src/test/groovy/datadog/trace/civisibility/git/GitClientGitInfoBuilderTest.groovy @@ -1,6 +1,7 @@ package datadog.trace.civisibility.git import datadog.trace.api.Config +import datadog.trace.civisibility.telemetry.CiVisibilityMetricCollectorImpl import datadog.trace.civisibility.git.tree.GitClient import datadog.trace.civisibility.utils.IOUtils import spock.lang.Specification @@ -23,11 +24,12 @@ class GitClientGitInfoBuilderTest extends Specification { given: givenGitRepo() + def metricCollector = Stub(CiVisibilityMetricCollectorImpl) def config = Stub(Config) config.getCiVisibilityGitRemoteName() >> "origin" config.getCiVisibilityGitCommandTimeoutMillis() >> GIT_COMMAND_TIMEOUT_MILLIS - def gitClientFactory = new GitClient.Factory(config) + def gitClientFactory = new GitClient.Factory(config, metricCollector) def infoBuilder = new GitClientGitInfoBuilder(config, gitClientFactory) when: diff --git a/dd-java-agent/agent-ci-visibility/src/test/groovy/datadog/trace/civisibility/git/tree/GitClientTest.groovy b/dd-java-agent/agent-ci-visibility/src/test/groovy/datadog/trace/civisibility/git/tree/GitClientTest.groovy index 68f29205469..eb9edf3f9e0 100644 --- a/dd-java-agent/agent-ci-visibility/src/test/groovy/datadog/trace/civisibility/git/tree/GitClientTest.groovy +++ b/dd-java-agent/agent-ci-visibility/src/test/groovy/datadog/trace/civisibility/git/tree/GitClientTest.groovy @@ -1,5 +1,6 @@ package datadog.trace.civisibility.git.tree +import datadog.trace.civisibility.telemetry.CiVisibilityMetricCollectorImpl import datadog.trace.civisibility.git.GitObject import datadog.trace.civisibility.git.pack.V2PackGitInfoExtractor import datadog.trace.civisibility.utils.IOUtils @@ -312,6 +313,7 @@ class GitClientTest extends Specification { } private givenGitClient() { - new GitClient(tempDir.toString(), "25 years ago", 10, GIT_COMMAND_TIMEOUT_MILLIS) + def metricCollector = Stub(CiVisibilityMetricCollectorImpl) + new GitClient(metricCollector, tempDir.toString(), "25 years ago", 10, GIT_COMMAND_TIMEOUT_MILLIS) } } diff --git a/dd-java-agent/agent-ci-visibility/src/test/groovy/datadog/trace/civisibility/git/tree/GitDataUploaderImplTest.groovy b/dd-java-agent/agent-ci-visibility/src/test/groovy/datadog/trace/civisibility/git/tree/GitDataUploaderImplTest.groovy index 34685918a74..b632296217e 100644 --- a/dd-java-agent/agent-ci-visibility/src/test/groovy/datadog/trace/civisibility/git/tree/GitDataUploaderImplTest.groovy +++ b/dd-java-agent/agent-ci-visibility/src/test/groovy/datadog/trace/civisibility/git/tree/GitDataUploaderImplTest.groovy @@ -1,6 +1,7 @@ package datadog.trace.civisibility.git.tree import datadog.trace.api.Config +import datadog.trace.civisibility.telemetry.CiVisibilityMetricCollectorImpl import datadog.trace.api.git.GitInfo import datadog.trace.api.git.GitInfoProvider import datadog.trace.civisibility.utils.IOUtils @@ -29,6 +30,8 @@ class GitDataUploaderImplTest extends Specification { def repoRoot = tempDir.toString() def repoUrl = "" + def metricCollector = Stub(CiVisibilityMetricCollectorImpl) + def config = Stub(Config) { getCiVisibilityGitUploadTimeoutMillis() >> 15_000 } @@ -36,7 +39,7 @@ class GitDataUploaderImplTest extends Specification { def gitInfoProvider = Stub(GitInfoProvider) gitInfoProvider.getGitInfo(repoRoot) >> new GitInfo(repoUrl, null, null, null) - def gitClient = new GitClient(repoRoot, "25 years ago", 3, TIMEOUT_MILLIS) + def gitClient = new GitClient(metricCollector, repoRoot, "25 years ago", 3, TIMEOUT_MILLIS) def uploader = new GitDataUploaderImpl(config, api, gitClient, gitInfoProvider, repoRoot, "origin") when: