Skip to content

Commit ec34054

Browse files
committed
[Feature] Export metrics in OpenMetrics text format
1 parent a5074a1 commit ec34054

File tree

18 files changed

+336
-1
lines changed

18 files changed

+336
-1
lines changed

pom.xml

Lines changed: 30 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,7 @@
9999
<swagger-annotations.version>1.5.10</swagger-annotations.version>
100100
<hibernate.validator.version>6.2.2.Final</hibernate.validator.version>
101101
<javax.annotation-api.version>1.3.2</javax.annotation-api.version>
102+
<prometheus.simpleclient.version>0.16.0</prometheus.simpleclient.version>
102103
<jsoup.version>1.14.3</jsoup.version>
103104
<jwt.version>0.10.7</jwt.version>
104105
<cron-utils.version>9.1.6</cron-utils.version>
@@ -352,6 +353,12 @@
352353
<artifactId>spring-boot-starter-jdbc</artifactId>
353354
<version>${spring-boot.version}</version>
354355
</dependency>
356+
<dependency>
357+
<groupId>org.springframework.boot</groupId>
358+
<artifactId>spring-boot-starter-aop</artifactId>
359+
<version>${spring-boot.version}</version>
360+
</dependency>
361+
355362
<dependency>
356363
<groupId>org.springframework.security</groupId>
357364
<artifactId>spring-security-core</artifactId>
@@ -378,7 +385,29 @@
378385
<artifactId>druid-spring-boot-starter</artifactId>
379386
<version>${druid-spring-boot-starter.version}</version>
380387
</dependency>
381-
388+
<!-- Metric Dependencies -->
389+
<dependency>
390+
<groupId>io.prometheus</groupId>
391+
<artifactId>simpleclient</artifactId>
392+
<version>${prometheus.simpleclient.version}</version>
393+
</dependency>
394+
<dependency>
395+
<groupId>io.prometheus</groupId>
396+
<artifactId>simpleclient_common</artifactId>
397+
<version>${prometheus.simpleclient.version}</version>
398+
</dependency>
399+
<!-- Hotspot JVM metrics-->
400+
<dependency>
401+
<groupId>io.prometheus</groupId>
402+
<artifactId>simpleclient_hotspot</artifactId>
403+
<version>${prometheus.simpleclient.version}</version>
404+
</dependency>
405+
<!-- Exposition HTTPServer-->
406+
<dependency>
407+
<groupId>io.prometheus</groupId>
408+
<artifactId>simpleclient_httpserver</artifactId>
409+
<version>${prometheus.simpleclient.version}</version>
410+
</dependency>
382411
<!-- ORM -->
383412
<dependency>
384413
<groupId>com.baomidou</groupId>

seatunnel-server/seatunnel-app/pom.xml

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -325,6 +325,11 @@
325325
<artifactId>spring-security-ldap</artifactId>
326326
</dependency>
327327

328+
<dependency>
329+
<groupId>org.springframework.boot</groupId>
330+
<artifactId>spring-boot-starter-aop</artifactId>
331+
</dependency>
332+
328333
<dependency>
329334
<groupId>com.baomidou</groupId>
330335
<artifactId>mybatis-plus-boot-starter</artifactId>
@@ -386,6 +391,24 @@
386391
<artifactId>h2</artifactId>
387392
</dependency>
388393

394+
<!-- Metric Dependencies -->
395+
<dependency>
396+
<groupId>io.prometheus</groupId>
397+
<artifactId>simpleclient</artifactId>
398+
</dependency>
399+
<dependency>
400+
<groupId>io.prometheus</groupId>
401+
<artifactId>simpleclient_common</artifactId>
402+
</dependency>
403+
<dependency>
404+
<groupId>io.prometheus</groupId>
405+
<artifactId>simpleclient_hotspot</artifactId>
406+
</dependency>
407+
<dependency>
408+
<groupId>io.prometheus</groupId>
409+
<artifactId>simpleclient_httpserver</artifactId>
410+
</dependency>
411+
389412
<dependency>
390413
<groupId>org.springframework.boot</groupId>
391414
<artifactId>spring-boot-starter-test</artifactId>

seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/adapter/SeatunnelWebAdapter.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ public class SeatunnelWebAdapter implements WebMvcConfigurer {
4444
public static final String REGISTER_PATH_PATTERN = "/users/register";
4545
private static final String RESOURCE_NAME_PATH_PATTERN =
4646
"/seatunnel/api/v1/resources/workspace";
47+
private static final String METRIC_PATH_PATTERN = "/metrics";
4748

4849
@Bean
4950
public AuthenticationInterceptor authenticationInterceptor() {
@@ -77,6 +78,7 @@ public void addInterceptors(InterceptorRegistry registry) {
7778
LOGIN_PATH_PATTERN,
7879
REGISTER_PATH_PATTERN,
7980
RESOURCE_NAME_PATH_PATTERN,
81+
METRIC_PATH_PATTERN,
8082
"/swagger-resources/**",
8183
"/webjars/**",
8284
"/v2/**",

seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/controller/JobDefinitionController.java

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@
2222
import org.apache.seatunnel.app.domain.request.job.JobReq;
2323
import org.apache.seatunnel.app.domain.response.PageInfo;
2424
import org.apache.seatunnel.app.domain.response.job.JobDefinitionRes;
25+
import org.apache.seatunnel.app.metrics.annotations.Counted;
26+
import org.apache.seatunnel.app.metrics.annotations.Timed;
2527
import org.apache.seatunnel.app.service.IJobDefinitionService;
2628
import org.apache.seatunnel.app.service.IJobTaskService;
2729
import org.apache.seatunnel.server.common.CodeGenerateUtils;
@@ -54,6 +56,12 @@ public class JobDefinitionController {
5456
*
5557
* @return created job id
5658
*/
59+
@Counted(
60+
name = "create_job_definition_request",
61+
help = "Total number of create job definition requests")
62+
@Timed(
63+
name = "create_job_definition_request_latency",
64+
help = "Latency of create job definition API in seconds")
5765
@PostMapping
5866
@ApiOperation(value = "create job definition", httpMethod = "POST")
5967
Result<Long> createJobDefinition(@RequestBody JobReq jobReq)
@@ -65,6 +73,9 @@ Result<Long> createJobDefinition(@RequestBody JobReq jobReq)
6573
}
6674
}
6775

76+
@Counted(
77+
name = "get_job_definitions_request",
78+
help = "Total number of get job definitions request")
6879
@GetMapping
6980
@ApiOperation(value = "get job definition", httpMethod = "GET")
7081
Result<PageInfo<JobDefinitionRes>> getJobDefinition(
@@ -75,12 +86,21 @@ Result<PageInfo<JobDefinitionRes>> getJobDefinition(
7586
return Result.success(jobService.getJob(searchName, pageNo, pageSize, jobMode));
7687
}
7788

89+
@Counted(
90+
name = "get_job_definition_by_id_request",
91+
help = "Total number of get job definition by id requests")
7892
@GetMapping("/{jobId}")
7993
@ApiOperation(value = "get job definition", httpMethod = "GET")
8094
Result<JobDefinition> getJobDefinition(@PathVariable long jobId) {
8195
return Result.success(jobService.getJobDefinitionByJobId(jobId));
8296
}
8397

98+
@Counted(
99+
name = "delete_job_definition_request",
100+
help = "Total number of delete job definition requests")
101+
@Timed(
102+
name = "delete_job_definition_request_latency",
103+
help = "Latency of delete job definition API in seconds")
84104
@DeleteMapping
85105
@ApiOperation(value = "delete job definition", httpMethod = "DELETE")
86106
Result<Void> deleteJobDefinition(

seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/controller/JobExecutorController.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
import org.apache.seatunnel.app.domain.request.job.JobExecParam;
2323
import org.apache.seatunnel.app.domain.response.executor.JobExecutionStatus;
2424
import org.apache.seatunnel.app.domain.response.executor.JobExecutorRes;
25+
import org.apache.seatunnel.app.metrics.annotations.Counted;
2526
import org.apache.seatunnel.app.service.IJobExecutorService;
2627
import org.apache.seatunnel.app.service.IJobInstanceService;
2728
import org.apache.seatunnel.app.service.ITaskInstanceService;
@@ -53,6 +54,7 @@ public class JobExecutorController {
5354
@Resource private IJobInstanceService jobInstanceService;
5455
@Resource private ITaskInstanceService<SeaTunnelJobInstanceDto> taskInstanceService;
5556

57+
@Counted(name = "execute_job_request", help = "Total number of execute job requests")
5658
@PostMapping("/execute")
5759
@ApiOperation(value = "Execute synchronization tasks", httpMethod = "POST")
5860
public Result<Long> jobExecutor(
@@ -77,6 +79,7 @@ public Result<JobExecutorRes> resource(
7779
}
7880
}
7981

82+
@Counted(name = "pause_job_request", help = "Total number of pause job requests")
8083
@GetMapping("/pause")
8184
public Result<Void> jobPause(
8285
@ApiParam(value = "jobInstanceId", required = true) @RequestParam Long jobInstanceId) {

seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/controller/JobTaskController.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@
2222
import org.apache.seatunnel.app.domain.request.job.JobTaskInfo;
2323
import org.apache.seatunnel.app.domain.request.job.PluginConfig;
2424
import org.apache.seatunnel.app.domain.response.job.JobTaskCheckRes;
25+
import org.apache.seatunnel.app.metrics.annotations.Counted;
26+
import org.apache.seatunnel.app.metrics.annotations.Timed;
2527
import org.apache.seatunnel.app.service.IJobTaskService;
2628

2729
import org.springframework.web.bind.annotation.DeleteMapping;
@@ -44,6 +46,10 @@ public class JobTaskController {
4446

4547
@Resource private IJobTaskService jobTaskService;
4648

49+
@Counted(name = "save_job_dag_request", help = "Total number of save job dag requests")
50+
@Timed(
51+
name = "save_job_dag_request_latency",
52+
help = "Latency of save job dag request in seconds")
4753
@PostMapping("/dag/{jobVersionId}")
4854
@ApiOperation(value = "save job dag", httpMethod = "POST")
4955
Result<JobTaskCheckRes> saveJobDAG(
@@ -59,6 +65,10 @@ Result<JobTaskInfo> getJob(
5965
return Result.success(jobTaskService.getTaskConfig(jobVersionId));
6066
}
6167

68+
@Counted(name = "save_job_task_request", help = "Total number of save job task requests")
69+
@Timed(
70+
name = "save_job_task_request_latency",
71+
help = "Latency of save job task request in seconds")
6272
@PostMapping("/task/{jobVersionId}")
6373
@ApiOperation(value = "save or update single task", httpMethod = "POST")
6474
Result<Void> saveSingleTask(
@@ -77,6 +87,10 @@ Result<PluginConfig> getSingleTask(
7787
return Result.success(jobTaskService.getSingleTask(jobVersionId, pluginId));
7888
}
7989

90+
@Counted(name = "delete_job_task_request", help = "Total number of delete job task requests")
91+
@Timed(
92+
name = "delete_job_task_request_latency",
93+
help = "Latency of delete job task request in seconds")
8094
@DeleteMapping("/task/{jobVersionId}")
8195
@ApiOperation(value = "delete single task", httpMethod = "DELETE")
8296
Result<Void> deleteSingleTask(

seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/controller/SeatunnelDatasourceController.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,8 @@
2929
import org.apache.seatunnel.app.domain.response.PageInfo;
3030
import org.apache.seatunnel.app.domain.response.datasource.DatasourceDetailRes;
3131
import org.apache.seatunnel.app.domain.response.datasource.DatasourceRes;
32+
import org.apache.seatunnel.app.metrics.annotations.Counted;
33+
import org.apache.seatunnel.app.metrics.annotations.Timed;
3234
import org.apache.seatunnel.app.service.IDatasourceService;
3335
import org.apache.seatunnel.app.utils.CartesianProductUtils;
3436
import org.apache.seatunnel.app.utils.PropertyUtils;
@@ -80,6 +82,8 @@ public class SeatunnelDatasourceController extends BaseController {
8082
private static final List<String> wsSupportDatasources =
8183
PropertyUtils.getList(Constants.WS_SUPPORT_DATASOURCES, Constants.COMMA);
8284

85+
@Counted(name = "create_datasource_requests", help = "Number of create datasource requests")
86+
@Timed(name = "create_datasource_latency", help = "Latency of create datasource API")
8387
@ApiOperation(value = "create datasource", notes = "create datasource")
8488
@ApiImplicitParams({
8589
@ApiImplicitParam(
@@ -120,6 +124,10 @@ Result<String> createDatasource(@RequestBody DatasourceReq req) {
120124
stringStringMap));
121125
}
122126

127+
@Counted(
128+
name = "test_connection_requests",
129+
help = "Number of test datasource connection requests")
130+
@Timed(name = "test_connection_latency", help = "Latency of check datasource connection API")
123131
@ApiOperation(value = "test datasource connection", notes = "test datasource connection")
124132
@ApiImplicitParams({
125133
@ApiImplicitParam(
@@ -142,6 +150,8 @@ Result<Boolean> testConnect(@RequestBody DatasourceCheckReq req) {
142150
req.getPluginName(), DEFAULT_PLUGIN_VERSION, req.getDatasourceConfig()));
143151
}
144152

153+
@Counted(name = "update_datasource_requests", help = "Number of update datasource requests")
154+
@Timed(name = "update_datasource_latency", help = "Latency of update datasource API")
145155
@ApiOperation(value = "update datasource", notes = "update datasource")
146156
@ApiImplicitParams({
147157
@ApiImplicitParam(
@@ -176,6 +186,8 @@ Result<Boolean> updateDatasource(
176186
stringStringMap));
177187
}
178188

189+
@Counted(name = "delete_datasource_requests", help = "Number of delete datasource requests")
190+
@Timed(name = "delete_datasource_latency", help = "Latency of delete datasource API")
179191
@ApiOperation(value = "delete datasource by id", notes = "delete datasource by id")
180192
@DeleteMapping("/{id}")
181193
Result<Boolean> deleteDatasource(@PathVariable("id") String id) {

seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/controller/TaskInstanceController.java

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

2020
import org.apache.seatunnel.app.common.Result;
2121
import org.apache.seatunnel.app.domain.dto.job.SeaTunnelJobInstanceDto;
22+
import org.apache.seatunnel.app.metrics.annotations.Counted;
23+
import org.apache.seatunnel.app.metrics.annotations.Timed;
2224
import org.apache.seatunnel.app.service.ITaskInstanceService;
2325
import org.apache.seatunnel.app.utils.PageInfo;
2426
import org.apache.seatunnel.common.constants.JobMode;
@@ -37,6 +39,8 @@ public class TaskInstanceController {
3739

3840
@Autowired ITaskInstanceService<SeaTunnelJobInstanceDto> taskInstanceService;
3941

42+
@Counted(name = "number_of_job_metric_request", help = "total number of job metrics request")
43+
@Timed(name = "job_metric_request_latency", help = "Latency of job metric api in seconds")
4044
@GetMapping("/jobMetrics")
4145
@ApiOperation(value = "get the jobMetrics list ", httpMethod = "GET")
4246
public Result<PageInfo<SeaTunnelJobInstanceDto>> getTaskInstanceList(

seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/controller/UserController.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,8 @@
2525
import org.apache.seatunnel.app.domain.response.PageInfo;
2626
import org.apache.seatunnel.app.domain.response.user.AddUserRes;
2727
import org.apache.seatunnel.app.domain.response.user.UserSimpleInfoRes;
28+
import org.apache.seatunnel.app.metrics.annotations.Counted;
29+
import org.apache.seatunnel.app.metrics.annotations.Timed;
2830
import org.apache.seatunnel.app.service.IUserService;
2931

3032
import org.springframework.web.bind.annotation.DeleteMapping;
@@ -110,6 +112,8 @@ public Result<Void> disable(
110112
return Result.success();
111113
}
112114

115+
@Counted(name = "user_login", help = "total number of user login request")
116+
@Timed(name = "user_login_request_latency", help = "Latency of login request in seconds")
113117
@PostMapping("/login")
114118
public Result<UserSimpleInfoRes> login(
115119
@RequestBody UserLoginReq req,
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package org.apache.seatunnel.app.metrics.annotations;
2+
3+
import java.lang.annotation.ElementType;
4+
import java.lang.annotation.Retention;
5+
import java.lang.annotation.RetentionPolicy;
6+
import java.lang.annotation.Target;
7+
8+
@Retention(RetentionPolicy.RUNTIME)
9+
@Target(ElementType.METHOD)
10+
public @interface Counted {
11+
String name();
12+
13+
String help() default "";
14+
}

0 commit comments

Comments
 (0)