Skip to content

Commit 74b9485

Browse files
committed
[Feature] Export metrics in OpenMetrics text format
1 parent 9aa95c6 commit 74b9485

File tree

19 files changed

+487
-5
lines changed

19 files changed

+487
-5
lines changed

pom.xml

Lines changed: 52 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>
@@ -114,6 +115,7 @@
114115
<log4j.version>1.2.17</log4j.version>
115116
<log4j-core.version>2.17.1</log4j-core.version>
116117
<slf4j.version>1.7.36</slf4j.version>
118+
<tomcat-embed-core.version>9.0.108</tomcat-embed-core.version>
117119
<skip.spotless>false</skip.spotless>
118120
</properties>
119121

@@ -368,6 +370,11 @@
368370
<version>${spring-boot.version}</version>
369371
<scope>test</scope>
370372
</dependency>
373+
<dependency>
374+
<groupId>org.springframework</groupId>
375+
<artifactId>spring-web</artifactId>
376+
<version>${spring.version}</version>
377+
</dependency>
371378
<dependency>
372379
<groupId>com.google.code.gson</groupId>
373380
<artifactId>gson</artifactId>
@@ -378,7 +385,45 @@
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>
411+
<!-- ORM -->
412+
<dependency>
413+
<groupId>com.baomidou</groupId>
414+
<artifactId>mybatis-plus-boot-starter</artifactId>
415+
<version>${mybatis-plus-boot-starter.version}</version>
416+
<exclusions>
417+
<exclusion>
418+
<groupId>org.springframework.boot</groupId>
419+
<artifactId>spring-boot-starter-jdbc</artifactId>
420+
</exclusion>
421+
<exclusion>
422+
<groupId>org.springframework.boot</groupId>
423+
<artifactId>spring-boot-autoconfigure</artifactId>
424+
</exclusion>
425+
</exclusions>
426+
</dependency>
382427
<dependency>
383428
<groupId>org.hibernate.validator</groupId>
384429
<artifactId>hibernate-validator</artifactId>
@@ -549,6 +594,12 @@
549594
<scope>compile</scope>
550595
</dependency>
551596

597+
<dependency>
598+
<groupId>org.apache.tomcat.embed</groupId>
599+
<artifactId>tomcat-embed-core</artifactId>
600+
<version>${tomcat-embed-core.version}</version>
601+
</dependency>
602+
552603
<dependency>
553604
<groupId>org.apache.seatunnel</groupId>
554605
<artifactId>datasource-s3</artifactId>

seatunnel-datasource/seatunnel-datasource-plugins/datasource-jdbc-db2/pom.xml

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -63,10 +63,6 @@
6363
<artifactId>db2jcc</artifactId>
6464
<version>db2jcc4</version>
6565
</dependency>
66-
<dependency>
67-
<groupId>org.apache.seatunnel</groupId>
68-
<artifactId>seatunnel-api</artifactId>
69-
</dependency>
7066

7167
</dependencies>
7268

seatunnel-server/seatunnel-app/pom.xml

Lines changed: 33 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>
@@ -391,6 +396,24 @@
391396
<artifactId>h2</artifactId>
392397
</dependency>
393398

399+
<!-- Metric Dependencies -->
400+
<dependency>
401+
<groupId>io.prometheus</groupId>
402+
<artifactId>simpleclient</artifactId>
403+
</dependency>
404+
<dependency>
405+
<groupId>io.prometheus</groupId>
406+
<artifactId>simpleclient_common</artifactId>
407+
</dependency>
408+
<dependency>
409+
<groupId>io.prometheus</groupId>
410+
<artifactId>simpleclient_hotspot</artifactId>
411+
</dependency>
412+
<dependency>
413+
<groupId>io.prometheus</groupId>
414+
<artifactId>simpleclient_httpserver</artifactId>
415+
</dependency>
416+
394417
<dependency>
395418
<groupId>org.springframework.boot</groupId>
396419
<artifactId>spring-boot-starter-test</artifactId>
@@ -440,6 +463,16 @@
440463
</exclusions>
441464
</dependency>
442465

466+
<dependency>
467+
<groupId>org.springframework</groupId>
468+
<artifactId>spring-web</artifactId>
469+
</dependency>
470+
471+
<dependency>
472+
<groupId>org.apache.tomcat.embed</groupId>
473+
<artifactId>tomcat-embed-core</artifactId>
474+
</dependency>
475+
443476
<dependency>
444477
<groupId>org.apache.seatunnel</groupId>
445478
<artifactId>datasource-kafka</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,

0 commit comments

Comments
 (0)