Skip to content

Commit 8f9e510

Browse files
authored
Merge pull request #148 from meiliang86/metrics
add metrics in java client
2 parents bdbe938 + 80f7951 commit 8f9e510

24 files changed

+935
-167
lines changed

build.gradle

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,8 +40,9 @@ targetCompatibility = 1.8
4040
dependencies {
4141
compile group: 'com.uber.tchannel', name: 'tchannel-core', version: '0.7.6'
4242
compile group: 'org.slf4j', name: 'slf4j-api', version: '1.7.25'
43-
compile(group: 'org.apache.thrift', name: 'libthrift', version: '0.9.3')
43+
compile group: 'org.apache.thrift', name: 'libthrift', version: '0.9.3'
4444
compile group: 'com.google.code.gson', name: 'gson', version: '2.8.2'
45+
compile group: 'com.uber.m3', name: 'tally-core', version: '0.2.0'
4546
testCompile group: 'junit', name: 'junit', version: '4.12'
4647
testCompile group: 'com.googlecode.junit-toolbox', name: 'junit-toolbox', version: '2.4'
4748
testCompile group: 'ch.qos.logback', name: 'logback-classic', version: '1.2.3'

src/main/java/com/uber/cadence/client/WorkflowClientOptions.java

Lines changed: 26 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@
1919

2020
import com.uber.cadence.converter.DataConverter;
2121
import com.uber.cadence.converter.JsonDataConverter;
22+
import com.uber.cadence.internal.metrics.NoopScope;
23+
import com.uber.m3.tally.Scope;
2224
import java.util.Objects;
2325

2426
/** Options for WorkflowClient configuration. */
@@ -30,6 +32,8 @@ public static final class Builder {
3032

3133
private WorkflowClientInterceptor[] interceptors = EMPTY_INTERCEPTOR_ARRAY;
3234

35+
private Scope metricsScope;
36+
3337
/**
3438
* Used to override default (JSON) data converter implementation.
3539
*
@@ -51,8 +55,21 @@ public Builder setInterceptors(WorkflowClientInterceptor... interceptors) {
5155
return this;
5256
}
5357

58+
/**
59+
* Sets the scope to be used for the workflow client for metrics reporting.
60+
*
61+
* @param metricsScope the scope to be used. Not null.
62+
*/
63+
public Builder setMetricsScope(Scope metricsScope) {
64+
this.metricsScope = Objects.requireNonNull(metricsScope);
65+
return this;
66+
}
67+
5468
public WorkflowClientOptions build() {
55-
return new WorkflowClientOptions(dataConverter, interceptors);
69+
if (metricsScope == null) {
70+
metricsScope = NoopScope.getInstance();
71+
}
72+
return new WorkflowClientOptions(dataConverter, interceptors, metricsScope);
5673
}
5774
}
5875

@@ -62,10 +79,13 @@ public WorkflowClientOptions build() {
6279

6380
private final WorkflowClientInterceptor[] interceptors;
6481

82+
private final Scope metricsScope;
83+
6584
private WorkflowClientOptions(
66-
DataConverter dataConverter, WorkflowClientInterceptor[] interceptors) {
85+
DataConverter dataConverter, WorkflowClientInterceptor[] interceptors, Scope metricsScope) {
6786
this.dataConverter = dataConverter;
6887
this.interceptors = interceptors;
88+
this.metricsScope = metricsScope;
6989
}
7090

7191
public DataConverter getDataConverter() {
@@ -75,4 +95,8 @@ public DataConverter getDataConverter() {
7595
public WorkflowClientInterceptor[] getInterceptors() {
7696
return interceptors;
7797
}
98+
99+
public Scope getMetricsScope() {
100+
return metricsScope;
101+
}
78102
}

src/main/java/com/uber/cadence/internal/external/GenericWorkflowClientExternalImpl.java

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,9 +31,14 @@
3131
import com.uber.cadence.internal.common.CheckedExceptionWrapper;
3232
import com.uber.cadence.internal.common.StartWorkflowExecutionParameters;
3333
import com.uber.cadence.internal.common.TerminateWorkflowExecutionParameters;
34+
import com.uber.cadence.internal.metrics.MetricsTag;
35+
import com.uber.cadence.internal.metrics.MetricsType;
3436
import com.uber.cadence.internal.replay.QueryWorkflowParameters;
3537
import com.uber.cadence.internal.replay.SignalExternalWorkflowParameters;
3638
import com.uber.cadence.serviceclient.IWorkflowService;
39+
import com.uber.m3.tally.Scope;
40+
import com.uber.m3.util.ImmutableMap;
41+
import java.util.Map;
3742
import java.util.UUID;
3843
import org.apache.thrift.TException;
3944

@@ -43,9 +48,13 @@ public final class GenericWorkflowClientExternalImpl implements GenericWorkflowC
4348

4449
private final IWorkflowService service;
4550

46-
public GenericWorkflowClientExternalImpl(IWorkflowService service, String domain) {
51+
private final Scope metricsScope;
52+
53+
public GenericWorkflowClientExternalImpl(
54+
IWorkflowService service, String domain, Scope metricsScope) {
4755
this.service = service;
4856
this.domain = domain;
57+
this.metricsScope = metricsScope;
4958
}
5059

5160
@Override
@@ -61,6 +70,20 @@ public IWorkflowService getService() {
6170
@Override
6271
public WorkflowExecution startWorkflow(StartWorkflowExecutionParameters startParameters)
6372
throws WorkflowExecutionAlreadyStartedError {
73+
try {
74+
return startWorkflowInternal(startParameters);
75+
} finally {
76+
// TODO: can probably cache this
77+
Map<String, String> tags =
78+
new ImmutableMap.Builder<String, String>(1)
79+
.put(MetricsTag.WORKFLOW_TYPE, startParameters.getWorkflowType().getName())
80+
.build();
81+
metricsScope.tagged(tags).counter(MetricsType.WORKFLOW_START_COUNTER).inc(1);
82+
}
83+
}
84+
85+
private WorkflowExecution startWorkflowInternal(StartWorkflowExecutionParameters startParameters)
86+
throws WorkflowExecutionAlreadyStartedError {
6487
StartWorkflowExecutionRequest request = new StartWorkflowExecutionRequest();
6588
request.setDomain(domain);
6689

src/main/java/com/uber/cadence/internal/external/ManualActivityCompletionClientFactoryImpl.java

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,20 +20,22 @@
2020
import com.uber.cadence.WorkflowExecution;
2121
import com.uber.cadence.converter.DataConverter;
2222
import com.uber.cadence.serviceclient.IWorkflowService;
23+
import com.uber.m3.tally.Scope;
2324

2425
public class ManualActivityCompletionClientFactoryImpl
2526
extends ManualActivityCompletionClientFactory {
2627

2728
private final IWorkflowService service;
28-
2929
private final DataConverter dataConverter;
3030
private final String domain;
31+
private final Scope metricsScope;
3132

3233
public ManualActivityCompletionClientFactoryImpl(
33-
IWorkflowService service, String domain, DataConverter dataConverter) {
34+
IWorkflowService service, String domain, DataConverter dataConverter, Scope metricsScope) {
3435
this.service = service;
3536
this.domain = domain;
3637
this.dataConverter = dataConverter;
38+
this.metricsScope = metricsScope;
3739
}
3840

3941
public IWorkflowService getService() {
@@ -55,7 +57,7 @@ public ManualActivityCompletionClient getClient(byte[] taskToken) {
5557
if (taskToken == null || taskToken.length == 0) {
5658
throw new IllegalArgumentException("null or empty task token");
5759
}
58-
return new ManualActivityCompletionClientImpl(service, taskToken, dataConverter);
60+
return new ManualActivityCompletionClientImpl(service, taskToken, dataConverter, metricsScope);
5961
}
6062

6163
@Override
@@ -67,6 +69,6 @@ public ManualActivityCompletionClient getClient(WorkflowExecution execution, Str
6769
throw new IllegalArgumentException("null activityId");
6870
}
6971
return new ManualActivityCompletionClientImpl(
70-
service, domain, execution, activityId, dataConverter);
72+
service, domain, execution, activityId, dataConverter, metricsScope);
7173
}
7274
}

src/main/java/com/uber/cadence/internal/external/ManualActivityCompletionClientImpl.java

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,9 @@
3131
import com.uber.cadence.client.ActivityCompletionFailureException;
3232
import com.uber.cadence.client.ActivityNotExistsException;
3333
import com.uber.cadence.converter.DataConverter;
34+
import com.uber.cadence.internal.metrics.MetricsType;
3435
import com.uber.cadence.serviceclient.IWorkflowService;
36+
import com.uber.m3.tally.Scope;
3537
import java.util.concurrent.CancellationException;
3638
import org.apache.thrift.TException;
3739
import org.slf4j.Logger;
@@ -51,29 +53,33 @@ class ManualActivityCompletionClientImpl extends ManualActivityCompletionClient
5153
private final String domain;
5254
private final WorkflowExecution execution;
5355
private final String activityId;
56+
private final Scope metricsScope;
5457

5558
public ManualActivityCompletionClientImpl(
56-
IWorkflowService service, byte[] taskToken, DataConverter dataConverter) {
59+
IWorkflowService service, byte[] taskToken, DataConverter dataConverter, Scope metricsScope) {
5760
this.service = service;
5861
this.taskToken = taskToken;
5962
this.dataConverter = dataConverter;
6063
this.domain = null;
6164
this.execution = null;
6265
this.activityId = null;
66+
this.metricsScope = metricsScope;
6367
}
6468

6569
public ManualActivityCompletionClientImpl(
6670
IWorkflowService service,
6771
String domain,
6872
WorkflowExecution execution,
6973
String activityId,
70-
DataConverter dataConverter) {
74+
DataConverter dataConverter,
75+
Scope metricsScope) {
7176
this.service = service;
7277
this.taskToken = null;
7378
this.domain = domain;
7479
this.execution = execution;
7580
this.activityId = activityId;
7681
this.dataConverter = dataConverter;
82+
this.metricsScope = metricsScope;
7783
}
7884

7985
@Override
@@ -85,6 +91,7 @@ public void complete(Object result) {
8591
request.setTaskToken(taskToken);
8692
try {
8793
service.RespondActivityTaskCompleted(request);
94+
metricsScope.counter(MetricsType.ACTIVITY_TASK_COMPLETED_COUNTER).inc(1);
8895
} catch (EntityNotExistsError e) {
8996
throw new ActivityNotExistsException(e);
9097
} catch (TException e) {
@@ -104,6 +111,7 @@ public void complete(Object result) {
104111
request.setRunID(execution.getRunId());
105112
try {
106113
service.RespondActivityTaskCompletedByID(request);
114+
metricsScope.counter(MetricsType.ACTIVITY_TASK_COMPLETED_BY_ID_COUNTER).inc(1);
107115
} catch (EntityNotExistsError e) {
108116
throw new ActivityNotExistsException(e);
109117
} catch (TException e) {
@@ -125,6 +133,7 @@ public void fail(Throwable failure) {
125133
request.setTaskToken(taskToken);
126134
try {
127135
service.RespondActivityTaskFailed(request);
136+
metricsScope.counter(MetricsType.ACTIVITY_TASK_FAILED_COUNTER).inc(1);
128137
} catch (EntityNotExistsError e) {
129138
throw new ActivityNotExistsException(e);
130139
} catch (TException e) {
@@ -139,6 +148,7 @@ public void fail(Throwable failure) {
139148
request.setRunID(execution.getRunId());
140149
try {
141150
service.RespondActivityTaskFailedByID(request);
151+
metricsScope.counter(MetricsType.ACTIVITY_TASK_FAILED_BY_ID_COUNTER).inc(1);
142152
} catch (EntityNotExistsError e) {
143153
throw new ActivityNotExistsException(e);
144154
} catch (TException e) {
@@ -178,6 +188,7 @@ public void reportCancellation(Object details) {
178188
request.setTaskToken(taskToken);
179189
try {
180190
service.RespondActivityTaskCanceled(request);
191+
metricsScope.counter(MetricsType.ACTIVITY_TASK_CANCELED_COUNTER).inc(1);
181192
} catch (TException e) {
182193
// There is nothing that can be done at this point.
183194
// so let's just ignore.
@@ -191,6 +202,7 @@ public void reportCancellation(Object details) {
191202
request.setRunID(execution.getRunId());
192203
try {
193204
service.RespondActivityTaskCanceledByID(request);
205+
metricsScope.counter(MetricsType.ACTIVITY_TASK_CANCELED_BY_ID_COUNTER).inc(1);
194206
} catch (TException e) {
195207
// There is nothing that can be done at this point.
196208
// so let's just ignore.
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
/*
2+
* Copyright 2012-2016 Amazon.com, Inc. or its affiliates. All Rights Reserved.
3+
*
4+
* Modifications copyright (C) 2017 Uber Technologies, Inc.
5+
*
6+
* Licensed under the Apache License, Version 2.0 (the "License"). You may not
7+
* use this file except in compliance with the License. A copy of the License is
8+
* located at
9+
*
10+
* http://aws.amazon.com/apache2.0
11+
*
12+
* or in the "license" file accompanying this file. This file is distributed on
13+
* an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
14+
* express or implied. See the License for the specific language governing
15+
* permissions and limitations under the License.
16+
*/
17+
18+
package com.uber.cadence.internal.metrics;
19+
20+
public class MetricsTag {
21+
public static final String ACTIVITY_ID = "ActivityID";
22+
public static final String ACTIVITY_TYPE = "ActivityType";
23+
public static final String DOMAIN = "Domain";
24+
public static final String EVENT_ID = "EventID";
25+
public static final String EVENT_TYPE = "EventType";
26+
public static final String RUN_ID = "RunID";
27+
public static final String TASK_LIST = "TaskList";
28+
public static final String TIMER_ID = "TimerID";
29+
public static final String WORKFLOW_ID = "WorkflowID";
30+
public static final String WORKFLOW_TYPE = "WorkflowType";
31+
public static final String WORKER_ID = "WorkerID";
32+
public static final String WORKER_TYPE = "WorkerType";
33+
public static final String SIDE_EFFECT_ID = "SideEffectID";
34+
public static final String CHILD_WORKFLOW_ID = "ChildWorkflowID";
35+
}

0 commit comments

Comments
 (0)