11package datadog .trace .civisibility ;
22
3+ import datadog .communication .ddagent .SharedCommunicationObjects ;
34import datadog .trace .api .Config ;
45import datadog .trace .api .civisibility .CIVisibility ;
56import datadog .trace .api .civisibility .InstrumentationBridge ;
1213import datadog .trace .civisibility .ci .CITagsProvider ;
1314import datadog .trace .civisibility .codeowners .Codeowners ;
1415import datadog .trace .civisibility .codeowners .CodeownersProvider ;
16+ import datadog .trace .civisibility .communication .BackendApi ;
17+ import datadog .trace .civisibility .communication .BackendApiFactory ;
18+ import datadog .trace .civisibility .config .ConfigurationApi ;
19+ import datadog .trace .civisibility .config .ConfigurationApiImpl ;
20+ import datadog .trace .civisibility .config .JvmInfoFactory ;
21+ import datadog .trace .civisibility .config .ModuleExecutionSettingsFactory ;
1522import datadog .trace .civisibility .coverage .TestProbes ;
1623import datadog .trace .civisibility .decorator .TestDecorator ;
1724import datadog .trace .civisibility .decorator .TestDecoratorImpl ;
2027import datadog .trace .civisibility .events .TestEventsHandlerImpl ;
2128import datadog .trace .civisibility .git .CILocalGitInfoBuilder ;
2229import datadog .trace .civisibility .git .CIProviderGitInfoBuilder ;
30+ import datadog .trace .civisibility .git .tree .GitClient ;
31+ import datadog .trace .civisibility .git .tree .GitDataApi ;
32+ import datadog .trace .civisibility .git .tree .GitDataUploader ;
33+ import datadog .trace .civisibility .git .tree .GitDataUploaderImpl ;
2334import datadog .trace .civisibility .source .BestEfforSourcePathResolver ;
2435import datadog .trace .civisibility .source .CompilerAidedSourcePathResolver ;
2536import datadog .trace .civisibility .source .MethodLinesResolver ;
2839import java .nio .file .Path ;
2940import java .nio .file .Paths ;
3041import java .util .Map ;
42+ import java .util .concurrent .CompletableFuture ;
3143import org .slf4j .Logger ;
3244import org .slf4j .LoggerFactory ;
3345
@@ -37,30 +49,34 @@ public class CiVisibilitySystem {
3749
3850 private static final String GIT_FOLDER_NAME = ".git" ;
3951
40- public static void start () {
52+ public static void start (SharedCommunicationObjects sco ) {
4153 Config config = Config .get ();
4254 if (!config .isCiVisibilityEnabled ()) {
4355 LOGGER .debug ("CI Visibility is disabled" );
4456 return ;
4557 }
4658
47- TestEventsHandler .Factory factory =
48- new CachingTestEventsHandlerFactory (
49- CiVisibilitySystem ::createTestEventsHandler ,
50- config .getCiVisibilityTestEventsHandlerCacheSize ());
51-
52- InstrumentationBridge .registerTestEventsHandlerFactory (factory );
53- InstrumentationBridge .registerBuildEventsHandlerFactory (BuildEventsHandlerImpl ::new );
54-
5559 GitInfoProvider .INSTANCE .registerGitInfoBuilder (new CIProviderGitInfoBuilder ());
5660 GitInfoProvider .INSTANCE .registerGitInfoBuilder (new CILocalGitInfoBuilder (GIT_FOLDER_NAME ));
5761
58- CIVisibility . registerSessionFactory ( buildSessionFactory (config ));
59-
62+ InstrumentationBridge . registerTestEventsHandlerFactory ( buildTestEventsHandlerFactory (config ));
63+ InstrumentationBridge . registerBuildEventsHandlerFactory ( BuildEventsHandlerImpl :: new );
6064 InstrumentationBridge .registerCoverageProbeStoreFactory (new TestProbes .TestProbesFactory ());
65+
66+ CIVisibility .registerSessionFactory (buildSessionFactory (config , sco ));
67+ }
68+
69+ private static TestEventsHandler .Factory buildTestEventsHandlerFactory (Config config ) {
70+ return new CachingTestEventsHandlerFactory (
71+ CiVisibilitySystem ::createTestEventsHandler ,
72+ config .getCiVisibilityTestEventsHandlerCacheSize ());
6173 }
6274
63- private static CIVisibility .SessionFactory buildSessionFactory (Config config ) {
75+ private static CIVisibility .SessionFactory buildSessionFactory (
76+ Config config , SharedCommunicationObjects sco ) {
77+ BackendApiFactory backendApiFactory = new BackendApiFactory (config , sco );
78+ BackendApi backendApi = backendApiFactory .createBackendApi ();
79+
6480 return (String projectName , Path projectRoot , String component , Long startTime ) -> {
6581 CIProviderInfoFactory ciProviderInfoFactory = new CIProviderInfoFactory ();
6682 CIProviderInfo ciProviderInfo = ciProviderInfoFactory .createCIProviderInfo (projectRoot );
@@ -73,17 +89,67 @@ private static CIVisibility.SessionFactory buildSessionFactory(Config config) {
7389 Map <String , String > ciTags = new CITagsProvider ().getCiTags (ciInfo );
7490 TestDecorator testDecorator = new TestDecoratorImpl (component , null , null , ciTags );
7591
92+ GitDataUploader gitDataUploader = buildGitDataUploader (config , backendApi , repoRoot );
93+ gitDataUploader .startOrObserveGitDataUpload ();
94+
95+ ModuleExecutionSettingsFactory moduleExecutionSettingsFactory =
96+ buildModuleExecutionSettingsFactory (config , backendApi , gitDataUploader , repoRoot );
97+
7698 return new DDTestSessionImpl (
7799 projectName ,
78100 startTime ,
79101 config ,
80102 testDecorator ,
81103 sourcePathResolver ,
82104 codeowners ,
83- methodLinesResolver );
105+ methodLinesResolver ,
106+ moduleExecutionSettingsFactory );
84107 };
85108 }
86109
110+ private static GitDataUploader buildGitDataUploader (
111+ Config config , BackendApi backendApi , String repoRoot ) {
112+ if (!config .isCiVisibilityGitUploadEnabled ()) {
113+ return () -> CompletableFuture .completedFuture (null );
114+ }
115+
116+ if (backendApi == null ) {
117+ LOGGER .warn (
118+ "Git tree data upload will be skipped since backend API client could not be created" );
119+ return () -> CompletableFuture .completedFuture (null );
120+ }
121+
122+ if (repoRoot == null ) {
123+ LOGGER .warn (
124+ "Git tree data upload will be skipped since Git repository path could not be determined" );
125+ return () -> CompletableFuture .completedFuture (null );
126+ }
127+
128+ long commandTimeoutMillis = config .getCiVisibilityGitCommandTimeoutMillis ();
129+ String remoteName = config .getCiVisibilityGitRemoteName ();
130+
131+ GitDataApi gitDataApi = new GitDataApi (backendApi );
132+ GitClient gitClient = new GitClient (repoRoot , "1 month ago" , 1000 , commandTimeoutMillis );
133+ return new GitDataUploaderImpl (config , gitDataApi , gitClient , remoteName );
134+ }
135+
136+ private static ModuleExecutionSettingsFactory buildModuleExecutionSettingsFactory (
137+ Config config ,
138+ BackendApi backendApi ,
139+ GitDataUploader gitDataUploader ,
140+ String repositoryRoot ) {
141+ ConfigurationApi configurationApi ;
142+ if (backendApi == null ) {
143+ LOGGER .warn (
144+ "Remote config and skippable tests requests will be skipped since backend API client could not be created" );
145+ configurationApi = ConfigurationApi .NO_OP ;
146+ } else {
147+ configurationApi = new ConfigurationApiImpl (backendApi );
148+ }
149+ return new ModuleExecutionSettingsFactory (
150+ config , configurationApi , new JvmInfoFactory (), gitDataUploader , repositoryRoot );
151+ }
152+
87153 private static TestEventsHandler createTestEventsHandler (
88154 String component , String testFramework , String testFrameworkVersion , Path path ) {
89155 CIProviderInfoFactory ciProviderInfoFactory = new CIProviderInfoFactory ();
@@ -109,13 +175,6 @@ private static TestEventsHandler createTestEventsHandler(
109175 methodLinesResolver );
110176 }
111177
112- private static String getRepositoryRoot (Path path ) {
113- CIProviderInfoFactory ciProviderInfoFactory = new CIProviderInfoFactory ();
114- CIProviderInfo ciProviderInfo = ciProviderInfoFactory .createCIProviderInfo (path );
115- CIInfo ciInfo = ciProviderInfo .buildCIInfo ();
116- return ciInfo .getCiWorkspace ();
117- }
118-
119178 private static SourcePathResolver getSourcePathResolver (String repoRoot ) {
120179 if (repoRoot != null ) {
121180 return new BestEfforSourcePathResolver (
0 commit comments