Newer
Older
sample-prometheus1 / src / main / java / com / sample / controller / SampleController.java
package com.sample.controller;

import io.micrometer.core.instrument.Counter;
import io.micrometer.core.instrument.Timer;
import io.micrometer.prometheus.PrometheusConfig;
import io.micrometer.prometheus.PrometheusMeterRegistry;
import io.prometheus.client.exporter.common.TextFormat;
import java.util.Random;
import java.util.concurrent.TimeUnit;
import lombok.Data;
import lombok.Builder;
import org.springframework.http.HttpHeaders;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;


@RestController
@RequestMapping("/sample")
public class SampleController {

  private final PrometheusMeterRegistry prometheusMeterRegistry;
  private final Counter helloCounter;

  public SampleController() {
    prometheusMeterRegistry = new PrometheusMeterRegistry(PrometheusConfig.DEFAULT);
    helloCounter = prometheusMeterRegistry.counter("hoge.counter", "group", "A", "sub-group", "B");
  }

  @GetMapping("/prometheus")
  public ResponseEntity<String> prometheus() {
    return ResponseEntity.ok()
        .header(HttpHeaders.CONTENT_TYPE, TextFormat.CONTENT_TYPE_004)
        .body(prometheusMeterRegistry.scrape());
  }

  @GetMapping("/hello")
  public SampleDto hello() {
    helloCounter.increment();
    Timer.builder("hoge.timer")
        .tag("group", "A")
        .publishPercentiles(0.5, 0.95, 0.99)
        .register(prometheusMeterRegistry)
        .record(() -> {
          try {
            Random rand = new Random();
            int num = rand.nextInt(3);
            TimeUnit.SECONDS.sleep(num + 1);
          } catch (Exception e) {
            throw new RuntimeException(e);
          }
        });
    return SampleDto.builder().msg("hello").build();
  }

  @Builder
  @Data
  private static class SampleDto {

    private String msg;
  }
}