Skip to content

Commit 8e9c5c4

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

File tree

18 files changed

+477
-1
lines changed

18 files changed

+477
-1
lines changed

pom.xml

Lines changed: 42 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>10.1.28</tomcat-embed-core.version>
117119
<skip.spotless>false</skip.spotless>
118120
</properties>
119121

@@ -352,6 +354,12 @@
352354
<artifactId>spring-boot-starter-jdbc</artifactId>
353355
<version>${spring-boot.version}</version>
354356
</dependency>
357+
<dependency>
358+
<groupId>org.springframework.boot</groupId>
359+
<artifactId>spring-boot-starter-aop</artifactId>
360+
<version>${spring-boot.version}</version>
361+
</dependency>
362+
355363
<dependency>
356364
<groupId>org.springframework.security</groupId>
357365
<artifactId>spring-security-core</artifactId>
@@ -368,6 +376,11 @@
368376
<version>${spring-boot.version}</version>
369377
<scope>test</scope>
370378
</dependency>
379+
<dependency>
380+
<groupId>org.springframework</groupId>
381+
<artifactId>spring-web</artifactId>
382+
<version>${spring.version}</version>
383+
</dependency>
371384
<dependency>
372385
<groupId>com.google.code.gson</groupId>
373386
<artifactId>gson</artifactId>
@@ -378,7 +391,29 @@
378391
<artifactId>druid-spring-boot-starter</artifactId>
379392
<version>${druid-spring-boot-starter.version}</version>
380393
</dependency>
381-
394+
<!-- Metric Dependencies -->
395+
<dependency>
396+
<groupId>io.prometheus</groupId>
397+
<artifactId>simpleclient</artifactId>
398+
<version>${prometheus.simpleclient.version}</version>
399+
</dependency>
400+
<dependency>
401+
<groupId>io.prometheus</groupId>
402+
<artifactId>simpleclient_common</artifactId>
403+
<version>${prometheus.simpleclient.version}</version>
404+
</dependency>
405+
<!-- Hotspot JVM metrics-->
406+
<dependency>
407+
<groupId>io.prometheus</groupId>
408+
<artifactId>simpleclient_hotspot</artifactId>
409+
<version>${prometheus.simpleclient.version}</version>
410+
</dependency>
411+
<!-- Exposition HTTPServer-->
412+
<dependency>
413+
<groupId>io.prometheus</groupId>
414+
<artifactId>simpleclient_httpserver</artifactId>
415+
<version>${prometheus.simpleclient.version}</version>
416+
</dependency>
382417
<!-- ORM -->
383418
<dependency>
384419
<groupId>com.baomidou</groupId>
@@ -565,6 +600,12 @@
565600
<scope>compile</scope>
566601
</dependency>
567602

603+
<dependency>
604+
<groupId>org.apache.tomcat.embed</groupId>
605+
<artifactId>tomcat-embed-core</artifactId>
606+
<version>${tomcat-embed-core.version}</version>
607+
</dependency>
608+
568609
<dependency>
569610
<groupId>org.apache.seatunnel</groupId>
570611
<artifactId>datasource-s3</artifactId>

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>
@@ -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>
@@ -435,6 +458,16 @@
435458
</exclusions>
436459
</dependency>
437460

461+
<dependency>
462+
<groupId>org.springframework</groupId>
463+
<artifactId>spring-web</artifactId>
464+
</dependency>
465+
466+
<dependency>
467+
<groupId>org.apache.tomcat.embed</groupId>
468+
<artifactId>tomcat-embed-core</artifactId>
469+
</dependency>
470+
438471
<dependency>
439472
<groupId>org.apache.seatunnel</groupId>
440473
<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,
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
/*
2+
* Licensed to the Apache Software Foundation (ASF) under one or more
3+
* contributor license agreements. See the NOTICE file distributed with
4+
* this work for additional information regarding copyright ownership.
5+
* The ASF licenses this file to You under the Apache License, Version 2.0
6+
* (the "License"); you may not use this file except in compliance with
7+
* the License. You may obtain a copy of the License at
8+
*
9+
* http://www.apache.org/licenses/LICENSE-2.0
10+
*
11+
* Unless required by applicable law or agreed to in writing, software
12+
* distributed under the License is distributed on an "AS IS" BASIS,
13+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14+
* See the License for the specific language governing permissions and
15+
* limitations under the License.
16+
*/
17+
18+
package org.apache.seatunnel.app.metrics.annotations;
19+
20+
import java.lang.annotation.ElementType;
21+
import java.lang.annotation.Retention;
22+
import java.lang.annotation.RetentionPolicy;
23+
import java.lang.annotation.Target;
24+
25+
@Retention(RetentionPolicy.RUNTIME)
26+
@Target(ElementType.METHOD)
27+
public @interface Counted {
28+
String name();
29+
30+
String help() default "";
31+
}

0 commit comments

Comments
 (0)