Pushgateway를 사용한 SpringBatch 지표 수집

개요


  • API는 메트릭 용 엔드 포인트에 의해 메트릭 수집이 가능하지만 일괄 처리가 완료되면 응용 프로그램이 종료되기 때문에 API와 동일하지 않습니다.
    따라서 배치가 끝날 때 Pushgateway에 메트릭을 보내 메트릭을 prometheus에서 수집 할 수 있습니다.

    구성


    SpringBatch --> pushgateway <-- prometheus
    

    이 기사에서는 SpringBatch --> pushgateway 의 부분을 메인으로

    Pushgateway 구축



    여기서 로컬로 Pushgateway를 구축합니다.

    1. 다운로드



    여기 에서 단말기에 있던 것을 다운로드
    Mac의 경우 "prometheus-2.19.2.darwin-amd64.tar.gz"

    2. 해동


    gunzip pushgateway-1.2.0.darwin-amd64.tar.gz
    tar -xf pushgateway-1.2.0.darwin-amd64.tar
    

    3. 시작


    cd pushgateway-1.2.0.darwin-amd64
    ./pushgateway
    

    4. UI에 액세스


    localhost:9091 에 액세스하여 이런 화면이 나오면 OK!
    지표가 전송되면 지표가 표시됩니다.



    SpringBatch 구현



    1. 애플리케이션 생성



    spring initializr 사용

    gradle 이용의 경우의 build.gradle는 이런 느낌
    ※ 약간 손으로 추가가 필요합니다

    build.gradle
    plugins {
        id 'org.springframework.boot' version '2.3.1.RELEASE'
        id 'io.spring.dependency-management' version '1.0.9.RELEASE'
        id 'java'
        id 'com.github.ben-manes.versions' version '0.28.0'
    }
    
    sourceCompatibility = 11
    targetCompatibility = 11
    
    repositories {
        mavenCentral()
    }
    
    dependencies {
        compileOnly('org.projectlombok:lombok')
        annotationProcessor('org.projectlombok:lombok')
    
        implementation 'org.springframework.boot:spring-boot-starter-batch'
        implementation 'org.springframework.boot:spring-boot-starter-actuator'
        implementation 'io.micrometer:micrometer-registry-prometheus'
        implementation 'io.prometheus:simpleclient_pushgateway'
        runtimeOnly 'com.h2database:h2'
    }
    

    2. 배치 구현



    배치 자체는 메인이 아니기 때문에, 「Hello World!」를 출력하는 것만의 배치

    BankConfiguration
    @RequiredArgsConstructor
    @Configuration
    @EnableBatchProcessing
    public class BankConfiguration {
    
        private final StepBuilderFactory stepBuilderFactory;
        private final JobBuilderFactory jobBuilderFactory;
    
        @Bean
        public HelloWorldTasklet helloWorldTasklet() {
            return new HelloWorldTasklet();
        }
    
        @Bean
        public Step helloWorldStep() {
            return stepBuilderFactory.get("helloWorldStep")
                    .tasklet(helloWorldTasklet())
                    .build();
        }
    
        @Bean
        public Job helloWorldJob() {
            return jobBuilderFactory.get("helloWorldJob")
                    .incrementer(new RunIdIncrementer())
                    .flow(helloWorldStep())
                    .end()
                    .build();
        }
    
        public class HelloWorldTasklet implements Tasklet {
            @Override
            public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) throws Exception {
                System.out.println("Hello world");
    
                return RepeatStatus.FINISHED;
            }
        }
    }
    

    3. 설정


  • Application properties

  • application.yml
    management:
      metrics:
        export:
          prometheus:
            pushgateway:
              # Pushgatewayへのメトリクス送信を有効化(デフォルト:false)
              enabled: true
              # PushgatewayのURL(デフォルト:http://localhost:9091)
              base-url: http://localhost:9091
              # メトリクスをpushする間隔(デフォルト:1m)
              push-rate: 30s
              # アプリケーションの識別子
              job: "hello-world-job"
              # メトリクスのタグ
              grouping-key: 
                tag1: "value1"
                tag2: "value2"
              # バッチ終了時の動作
              # -   none:なにもしない(デフォルト)
              # -   push:終了前にメトリクスを送信する
              # - delete:終了前にメトリクスを削除する
              shutdown-operation: push
    

    실행!





    UI로 전송된 지표가 표시되었습니다! !

    prometheus에서 참조하는 경우 /metrics 경로를 지정하면 OK입니다.



    쉘 스크립트에서도 curl로 push 할 수 있습니다.
    # echo "<メトリクス名> <値>" | curl --data-binary @- http://<host>:<port>/metrics/job/<ジョブ名>/<タグ名1>/<値1>/<タグ名2>/<値2>/...
    echo "some_metric 12.3" | curl --data-binary @- http://localhost:9091/metrics/job/jnb_name/tag1/val1
    

    좋은 웹페이지 즐겨찾기