Skip to content

Commit 5c56a05

Browse files
IoannisPanagiotaslassewesth
authored andcommitted
Capture graph project metrics
Co-authored-by: Ioannis Panagiotas <ioannis.panagiotas@neotechnology.com> Co-Authored-By: Lasse Westh-Nielsen <lassewesth@gmail.com>
1 parent 33dbf48 commit 5c56a05

File tree

26 files changed

+195
-88
lines changed

26 files changed

+195
-88
lines changed

applications/graph-store-catalog/build.gradle

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ dependencies {
3838
implementation project(':graph-schema-api')
3939
implementation project(':logging')
4040
implementation project(':memory-usage')
41+
implementation project(':metrics-api')
4142
implementation project(':native-projection')
4243
implementation project(':neo4j-api')
4344
implementation project(':progress-tracking')

applications/graph-store-catalog/src/main/java/org/neo4j/gds/applications/graphstorecatalog/DefaultCatalogBusinessFacade.java

Lines changed: 39 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@
4343
import org.neo4j.gds.graphsampling.RandomWalkBasedNodesSampler;
4444
import org.neo4j.gds.graphsampling.config.RandomWalkWithRestartsConfig;
4545
import org.neo4j.gds.logging.Log;
46+
import org.neo4j.gds.metrics.projections.ProjectionMetricsService;
4647
import org.neo4j.gds.projection.GraphProjectNativeResult;
4748
import org.neo4j.gds.results.MemoryEstimateResult;
4849
import org.neo4j.gds.transaction.TransactionContext;
@@ -107,6 +108,7 @@ public class DefaultCatalogBusinessFacade implements CatalogBusinessFacade {
107108
private final GraphSamplingApplication graphSamplingApplication;
108109
private final EstimateCommonNeighbourAwareRandomWalkApplication estimateCommonNeighbourAwareRandomWalkApplication;
109110
private final GenerateGraphApplication generateGraphApplication;
111+
private final ProjectionMetricsService projectionMetricsService;
110112

111113
public DefaultCatalogBusinessFacade(
112114
Log log,
@@ -132,7 +134,8 @@ public DefaultCatalogBusinessFacade(
132134
WriteNodePropertiesApplication writeNodePropertiesApplication,
133135
WriteRelationshipPropertiesApplication writeRelationshipPropertiesApplication,
134136
WriteNodeLabelApplication writeNodeLabelApplication,
135-
WriteRelationshipsApplication writeRelationshipsApplication
137+
WriteRelationshipsApplication writeRelationshipsApplication,
138+
ProjectionMetricsService projectionMetricsService
136139
) {
137140
this.log = log;
138141

@@ -160,6 +163,7 @@ public DefaultCatalogBusinessFacade(
160163
this.graphSamplingApplication = graphSamplingApplication;
161164
this.estimateCommonNeighbourAwareRandomWalkApplication = estimateCommonNeighbourAwareRandomWalkApplication;
162165
this.generateGraphApplication = generateGraphApplication;
166+
this.projectionMetricsService = projectionMetricsService;
163167
}
164168

165169
@Override
@@ -230,16 +234,23 @@ public GraphProjectNativeResult nativeProject(
230234
rawConfiguration
231235
);
232236

233-
return nativeProjectApplication.project(
234-
databaseId,
235-
graphDatabaseService,
236-
graphProjectMemoryUsageService,
237-
taskRegistryFactory,
238-
terminationFlag,
239-
transactionContext,
240-
userLogRegistryFactory,
241-
configuration
242-
);
237+
var projectMetric = projectionMetricsService.createNative();
238+
try(projectMetric) {
239+
projectMetric.start();
240+
return nativeProjectApplication.project(
241+
databaseId,
242+
graphDatabaseService,
243+
graphProjectMemoryUsageService,
244+
taskRegistryFactory,
245+
terminationFlag,
246+
transactionContext,
247+
userLogRegistryFactory,
248+
configuration
249+
);
250+
} catch (Exception e) {
251+
projectMetric.failed();
252+
throw e;
253+
}
243254
}
244255

245256
@Override
@@ -296,16 +307,23 @@ public GraphProjectCypherResult cypherProject(
296307
rawConfiguration
297308
);
298309

299-
return cypherProjectApplication.project(
300-
databaseId,
301-
graphDatabaseService,
302-
graphProjectMemoryUsageService,
303-
taskRegistryFactory,
304-
terminationFlag,
305-
transactionContext,
306-
userLogRegistryFactory,
307-
configuration
308-
);
310+
var projectMetric = projectionMetricsService.createCypher();
311+
try(projectMetric) {
312+
projectMetric.start();
313+
return cypherProjectApplication.project(
314+
databaseId,
315+
graphDatabaseService,
316+
graphProjectMemoryUsageService,
317+
taskRegistryFactory,
318+
terminationFlag,
319+
transactionContext,
320+
userLogRegistryFactory,
321+
configuration
322+
);
323+
} catch (Exception e) {
324+
projectMetric.failed();
325+
throw e;
326+
}
309327
}
310328

311329
@Override

applications/graph-store-catalog/src/test/java/org/neo4j/gds/applications/graphstorecatalog/DefaultCatalogBusinessFacadeTest.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@ void shouldDetermineGraphExists() {
6161
null,
6262
null,
6363
null,
64+
null,
6465
null
6566
);
6667

@@ -101,6 +102,7 @@ void shouldDetermineGraphDoesNotExist() {
101102
null,
102103
null,
103104
null,
105+
null,
104106
null
105107
);
106108

@@ -145,6 +147,7 @@ void shouldValidateInputGraphName() {
145147
null,
146148
null,
147149
null,
150+
null,
148151
null
149152
);
150153

@@ -180,6 +183,7 @@ void shouldUseStrictValidationWhenProjecting() {
180183
null,
181184
null,
182185
null,
186+
null,
183187
null
184188
);
185189

@@ -250,6 +254,7 @@ void shouldHandleNullsInNativeProjectParameters() {
250254
null,
251255
null,
252256
null,
257+
null,
253258
null
254259
);
255260

@@ -345,6 +350,7 @@ void shouldHandleNullsInCypherProjectParameters() {
345350
null,
346351
null,
347352
null,
353+
null,
348354
null
349355
);
350356

@@ -438,6 +444,7 @@ void shouldDoExistenceCheckWhenProjecting() {
438444
null,
439445
null,
440446
null,
447+
null,
441448
null
442449
);
443450

@@ -519,6 +526,7 @@ void shouldDoPositiveExistenceCheckWhenProjectingSubGraph() {
519526
null,
520527
null,
521528
null,
529+
null,
522530
null
523531
);
524532

cypher-aggregation/src/main/java/org/neo4j/gds/projection/AlphaCypherAggregation.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
import org.neo4j.gds.compat.Neo4jProxy;
2727
import org.neo4j.gds.core.Username;
2828
import org.neo4j.gds.core.loading.Capabilities.WriteMode;
29+
import org.neo4j.gds.metrics.MetricsFacade;
2930
import org.neo4j.graphdb.GraphDatabaseService;
3031
import org.neo4j.graphdb.Transaction;
3132
import org.neo4j.internal.kernel.api.exceptions.ProcedureException;
@@ -104,6 +105,7 @@ public static CompatUserAggregationFunction newInstance() {
104105
@Override
105106
public CompatUserAggregator create(Context ctx) throws ProcedureException {
106107
var databaseService = Neo4jProxy.lookupComponentProvider(ctx, GraphDatabaseService.class, true);
108+
var metricsFacade = Neo4jProxy.lookupComponentProvider(ctx, MetricsFacade.class, true);
107109
var username = Neo4jProxy.lookupComponentProvider(ctx, Username.class, true);
108110
var transaction = Neo4jProxy.lookupComponentProvider(ctx, Transaction.class, true);
109111
var queryProvider = ExecutingQueryProvider.fromTransaction(transaction);
@@ -117,7 +119,8 @@ public CompatUserAggregator create(Context ctx) throws ProcedureException {
117119
DatabaseId.of(databaseService.databaseName()),
118120
username.username(),
119121
writeMode,
120-
queryProvider
122+
queryProvider,
123+
metricsFacade.projectionMetrics()
121124
);
122125
}
123126
}

cypher-aggregation/src/main/java/org/neo4j/gds/projection/AlphaGraphAggregator.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121

2222
import org.neo4j.gds.api.DatabaseId;
2323
import org.neo4j.gds.core.loading.Capabilities.WriteMode;
24+
import org.neo4j.gds.metrics.projections.ProjectionMetricsService;
2425
import org.neo4j.internal.kernel.api.exceptions.ProcedureException;
2526
import org.neo4j.kernel.api.exceptions.Status;
2627
import org.neo4j.values.AnyValue;
@@ -36,9 +37,10 @@ public class AlphaGraphAggregator extends GraphAggregator {
3637
DatabaseId databaseId,
3738
String username,
3839
WriteMode writeMode,
39-
ExecutingQueryProvider queryProvider
40+
ExecutingQueryProvider queryProvider,
41+
ProjectionMetricsService projectionMetricsService
4042
) {
41-
super(databaseId, username, writeMode, queryProvider);
43+
super(databaseId, username, writeMode, queryProvider, projectionMetricsService);
4244
}
4345

4446
@Override

cypher-aggregation/src/main/java/org/neo4j/gds/projection/CypherAggregation.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
import org.neo4j.gds.compat.Neo4jProxy;
2727
import org.neo4j.gds.core.Username;
2828
import org.neo4j.gds.core.loading.Capabilities.WriteMode;
29+
import org.neo4j.gds.metrics.MetricsFacade;
2930
import org.neo4j.graphdb.GraphDatabaseService;
3031
import org.neo4j.graphdb.Transaction;
3132
import org.neo4j.internal.kernel.api.exceptions.ProcedureException;
@@ -103,6 +104,7 @@ public static CompatUserAggregationFunction newInstance() {
103104
@Override
104105
public CompatUserAggregator create(Context ctx) throws ProcedureException {
105106
var databaseService = Neo4jProxy.lookupComponentProvider(ctx, GraphDatabaseService.class, true);
107+
var metricsFacade = Neo4jProxy.lookupComponentProvider(ctx, MetricsFacade.class, true);
106108
var username = Neo4jProxy.lookupComponentProvider(ctx, Username.class, true);
107109
var transaction = Neo4jProxy.lookupComponentProvider(ctx, Transaction.class, true);
108110
var queryProvider = ExecutingQueryProvider.fromTransaction(transaction);
@@ -116,7 +118,8 @@ public CompatUserAggregator create(Context ctx) throws ProcedureException {
116118
DatabaseId.of(databaseService.databaseName()),
117119
username.username(),
118120
writeMode,
119-
queryProvider
121+
queryProvider,
122+
metricsFacade.projectionMetrics()
120123
);
121124
}
122125
}

cypher-aggregation/src/main/java/org/neo4j/gds/projection/GraphAggregator.java

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
import org.neo4j.gds.core.loading.construction.NodeLabelTokens;
3333
import org.neo4j.gds.core.loading.construction.PropertyValues;
3434
import org.neo4j.gds.core.utils.ProgressTimer;
35+
import org.neo4j.gds.metrics.projections.ProjectionMetricsService;
3536
import org.neo4j.internal.kernel.api.exceptions.ProcedureException;
3637
import org.neo4j.kernel.api.exceptions.Status;
3738
import org.neo4j.kernel.impl.util.ValueUtils;
@@ -67,6 +68,7 @@ abstract class GraphAggregator implements CompatUserAggregator {
6768
private final String username;
6869
private final WriteMode writeMode;
6970
private final ExecutingQueryProvider queryProvider;
71+
private final ProjectionMetricsService projectionMetricsService;
7072

7173
private final ProgressTimer progressTimer;
7274
private final ConfigValidator configValidator;
@@ -83,12 +85,14 @@ abstract class GraphAggregator implements CompatUserAggregator {
8385
DatabaseId databaseId,
8486
String username,
8587
WriteMode writeMode,
86-
ExecutingQueryProvider queryProvider
88+
ExecutingQueryProvider queryProvider,
89+
ProjectionMetricsService projectionMetricsService
8790
) {
8891
this.databaseId = databaseId;
8992
this.username = username;
9093
this.writeMode = writeMode;
9194
this.queryProvider = queryProvider;
95+
this.projectionMetricsService = projectionMetricsService;
9296
this.progressTimer = ProgressTimer.start();
9397
this.lock = new ReentrantLock();
9498
this.configValidator = new ConfigValidator();
@@ -189,10 +193,13 @@ private static NodeLabelToken tryLabelsConfig(AnyValue nodeLabels, String nodeLa
189193

190194
@Override
191195
public AnyValue result() throws ProcedureException {
196+
var projectionMetric = projectionMetricsService.createCypherV2();
192197
AggregationResult result;
193-
try {
198+
try(projectionMetric) {
199+
projectionMetric.start();
194200
result = buildGraph();
195201
} catch (Exception e) {
202+
projectionMetric.failed();
196203
throw new ProcedureException(
197204
Status.Procedure.ProcedureCallFailed,
198205
e,

cypher-aggregation/src/main/java/org/neo4j/gds/projection/ProductGraphAggregator.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121

2222
import org.neo4j.gds.api.DatabaseId;
2323
import org.neo4j.gds.core.loading.Capabilities.WriteMode;
24+
import org.neo4j.gds.metrics.projections.ProjectionMetricsService;
2425
import org.neo4j.internal.kernel.api.exceptions.ProcedureException;
2526
import org.neo4j.kernel.api.exceptions.Status;
2627
import org.neo4j.values.AnyValue;
@@ -34,9 +35,10 @@ public class ProductGraphAggregator extends GraphAggregator {
3435
DatabaseId databaseId,
3536
String username,
3637
WriteMode writeMode,
37-
ExecutingQueryProvider queryProvider
38+
ExecutingQueryProvider queryProvider,
39+
ProjectionMetricsService projectionMetricsService
3840
) {
39-
super(databaseId, username, writeMode, queryProvider);
41+
super(databaseId, username, writeMode, queryProvider, projectionMetricsService);
4042
}
4143

4244
@Override

cypher-aggregation/src/test/java/org/neo4j/gds/projection/ProductGraphAggregatorTest.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
import org.neo4j.gds.api.DatabaseId;
2424
import org.neo4j.gds.core.loading.Capabilities.WriteMode;
2525
import org.neo4j.gds.core.loading.GraphStoreCatalog;
26+
import org.neo4j.gds.metrics.MetricsFacade;
2627
import org.neo4j.values.storable.NoValue;
2728
import org.neo4j.values.storable.Values;
2829
import org.neo4j.values.virtual.MapValue;
@@ -41,7 +42,8 @@ void shouldImportHighNodeIds() {
4142
databaseId,
4243
userName,
4344
WriteMode.LOCAL,
44-
ExecutingQueryProvider.empty()
45+
ExecutingQueryProvider.empty(),
46+
MetricsFacade.PASSTHROUGH_METRICS_FACADE.projectionMetrics()
4547
);
4648

4749
long source = 1L << 50;

executor/src/main/java/org/neo4j/gds/executor/ExecutionContext.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -37,8 +37,7 @@
3737
import org.neo4j.gds.core.write.NodePropertyExporterBuilder;
3838
import org.neo4j.gds.core.write.RelationshipExporterBuilder;
3939
import org.neo4j.gds.core.write.RelationshipStreamExporterBuilder;
40-
import org.neo4j.gds.metrics.algorithms.AlgorithmMetricsService;
41-
import org.neo4j.gds.metrics.PassthroughExecutionMetricRegistrar;
40+
import org.neo4j.gds.metrics.MetricsFacade;
4241
import org.neo4j.logging.Log;
4342
import org.neo4j.logging.NullLog;
4443

@@ -72,7 +71,7 @@ public interface ExecutionContext {
7271

7372
boolean isGdsAdmin();
7473

75-
AlgorithmMetricsService algorithmMetricsService();
74+
MetricsFacade metricsFacade();
7675

7776
@Nullable
7877
RelationshipStreamExporterBuilder relationshipStreamExporterBuilder();
@@ -178,8 +177,9 @@ public boolean isGdsAdmin() {
178177
}
179178

180179
@Override
181-
public AlgorithmMetricsService algorithmMetricsService() {
182-
return new AlgorithmMetricsService(new PassthroughExecutionMetricRegistrar());
180+
public MetricsFacade metricsFacade() {
181+
return MetricsFacade.PASSTHROUGH_METRICS_FACADE;
182+
183183
}
184184

185185
@Override

0 commit comments

Comments
 (0)