IK.AM

@making's tech note


Metrics Forwarder Serviceを使ってSpring Boot ActuatorのメトリクスをPWS/PCFに送る


Metrics Forwarder for PCFを使うと簡単にSpring Boot ActuatorのメトリクスをPCF Metricsに送れます。Pivotal Cloud Foundryユーザーは次のTileをインストールすればこれらが利用可能です。

PCF MetricsはPivotal Web Servicesでも去年から利用可能です。つい最近Metrics Forwarderも利用可能になったので、簡単ですが使い方を紹介します。

目次

アプリケーションの設定

アプリケーション側はspring-boot-starter-actuatorを入れるだけです。

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

一般的にSpring Boot Actuatorのメトリクスを外部に送信しするにはMetrics Writerを設定する必要があります。例えばRedisに送信する場合は次の設定を行います。

@Bean
@ExportMetricWriter
MetricWriter metricWriter(MetricExportProperties export) {
    return new RedisMetricRepository(connectionFactory,
        export.getRedis().getPrefix(), export.getRedis().getKey());
}

Cloud Foundryを使う場合は、この設定は不要です。Metrics Fowarder Serviceがバインドされている場合は、アプリケーションのステージングのタイミングでこのMetrics Forwarder Serviceへメトリクスを送信するためのMetrics Writerが自動で組み込まれるためです。Metrics Fowarder Serviceをバインドさえすれば、他の設定は不要です(out of the boxな機能と言います)。楽チンです。

image.png

ちなみに自動で組み込まれるMetrics Writerの実装はhttps://github.com/cloudfoundry/java-buildpack-metric-writerです。

Metrics Forwarder Serviceのサービスインスタンス作成

Marketplaceから"Metrics Forwarder for PCF"を選択してください。

image.png

Planを選択してください。どれもfreeですが、Rate Limitの制限が異なります。デモ用途なら4x4000にしてください。

image.png

インスタンス名をここではdemo-metrics-forwarderにして、ADDをクリックすればMetrics Forwarderのサービスインスタンスが作成されます。

image.png

コマンドラインで作成する場合は

cf create-service metrics-forwarder 4x4000 demo-metrics-forwarder

でOK。

アプリケーションのデプロイ

次のようなプロジェクト直下に次のmanifest.ymlを作成し、namepathを環境に合わせて修正してください。

applications:
- name: <your-application-name>
  buildpack: java_buildpack
  memory: 1g
  path: target/<your-application>-0.0.1-SNAPSHOT.jar
  services:
  - demo-metrics-forwarder

あとは

cf push

でデプロイしてください。起動時のログにMetric Writerのインストールログが出力されることを確認されることを確認してください。

PCF Metricsでメトリクス確認

Apps Managerからデプロイしたアプリケーションの画面に行き、"View in PCF Metrics"をクリックしてください。

image.png

デフォルトで次のようなコンテナのメトリクスが取得できます。

image.png

"ADD CHART"をクリックすると、メトリクスを追加できます。

image.png

image.png

"Choose how to aggregate the data across instances"はインスタンス数が2以上の場合で、メトリクスを集約する場合の集約方法です。(view instancesトグルで切り替えられます。集約する場合はトグルをOFF)

  • Average ... 全インスタンスの平均値
  • Maximum ... 全インスタンスの最大値
  • Minimum ... 全インスタンスの最小値
  • Total ... 全インスタンスの合計

です。特別なメトリクスでなければ、Couterの場合はTotalをGaugeの場合はAverageを選択すれば良いでしょう。

image.png

image.png

次のようにSpring Boot Actuatorのメトリクスが表示されます。

image.png

カスタムメトリクスの送信

デフォルトでは汎用的なメトリクスのみ取得できます。Spring Boot Actuatorの/metricsエンドポイントのデフォルトの結果と同じです。

アプリケーション固有のメトリクスを送りたい場合は、アプリケーションにSpring Boot Actuatorのorg.springframework.boot.actuate.metrics.CounterServiceまたはorg.springframework.boot.actuate.metrics.GaugeServiceをインジェクションしてからメトリクスを設定してください。

@RestController
public class HelloController {
    private final CounterService counterService;
    private final GaugeService gaugeService;

    public HelloController(CounterService counterService, GaugeService gaugeService) {
        this.counterService = counterService;
        this.gaugeService = gaugeService;
    }

    @GetMapping
    public Object hello() {
        this.counterService.increment("hello");
        long start = System.currentTimeMillis();
        // do something
        long elapsed = System.currentTimeMillis() - start;
        this.gaugeService.submit("insert.elapsed", elapsed);
        return result;
    }
}

この例の場合、counter.hellogauge.insert.elapsedという名前のメトリクスが追加されます。

これもPCF Metricsで表示可能です。

image.png

サンプルコードはhttps://github.com/making/demo-metrics-forwarderです。

ちなみにMetrics Forwarder Service自体はSpring Boot専用ではなく、buildpackによって自動で組み込まれるMetrics WriterがHTTP APIに対してPOSTしているだけです。このエンドポイントにメトリクスを送信できれば、任意の言語でも利用可能です。Go言語からこのメトリクスを送信するにはhttps://github.com/pivotal-cf/go-metrics-pcfを使用してください。

MicrometerのメトリクスをPCF Metricsに送信

Spring Boot 2からSpring Boot Actuatorのメトリクスは大幅に変更されます。独自のメトリクスフォーマットがMicrometerに置き換わります。 現時点ではCloud FoundryのMetrics WriterはSpring Boot 2には未対応ですが、今後Micrometerに対応予定です。

ここではMicrometerのSpring 1.5サポート(micrometer-spring-legacy)を使って、MicrometerのメトリクスをMetrics Forwarder Serviceを経由して、PCF Metricsに送信します。

試してみたところ、MicrometerのDropwizardメトリクスラッパーであるio.micrometer.core.instrument.dropwizard.DropwizardMeterRegistryとSpring Boot ActuatorのDropwizardMetricsServicesを連携すれば簡単に送信可能でした。

pom.xmlに次の依存ライブラリを設定します。ここではDropwizardMeterRegistryの実装ライブラリとしてmicrometer-registry-jmxを使用します。

    <properties>
        <!-- ... -->
        <micrometer.version>1.0.0-rc.3</micrometer.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>io.micrometer</groupId>
            <artifactId>micrometer-spring-legacy</artifactId>
            <version>${micrometer.version}</version>
        </dependency>
        <dependency>
            <groupId>io.micrometer</groupId>
            <artifactId>micrometer-registry-jmx</artifactId>
            <version>${micrometer.version}</version>
        </dependency>
    </dependencies>
    <repositories>
        <repository>
            <id>spring-milestones</id>
            <name>Spring Milestones</name>
            <url>https://repo.spring.io/milestone</url>
            <snapshots>
                <enabled>false</enabled>
            </snapshots>
        </repository>
    </repositories>

次のようなJava Configを作成してください。

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import com.codahale.metrics.MetricRegistry;

import io.micrometer.core.instrument.composite.CompositeMeterRegistry;
import io.micrometer.core.instrument.dropwizard.DropwizardMeterRegistry;

@Configuration
public class MetricsConfig {
    @Bean
    public MetricRegistry metricRegistry(CompositeMeterRegistry registry) {
        return registry.getRegistries().stream()
                .filter(x -> x instanceof DropwizardMeterRegistry)
                .map(DropwizardMeterRegistry.class::cast)
                .map(DropwizardMeterRegistry::getDropwizardRegistry).findAny()
                .orElseGet(MetricRegistry::new);
    }
}

この設定によって、DropwizardMeterRegistrycom.codahale.metrics.MetricRegistryDropwizardMetricsServicesのそれが共有され、MicrometerのメトリクスがSpring Boot Actuator 1.5のメトリクスに反映されます。そして、Metrics WriterによってMetrics Forwarder Serviceに転送されます。

この設定を含めて再度ビルドしてcf pushすることで、PCF MetricsでMicrometerのメトリクス(階層化された名前にリネームされます) を表示可能になります。

image.png

image.png


Metrics ForwarderとPCF Metricsを使って、Spring Boot ActuatorのメトリクスをOut of the Boxで表示することができることを紹介しました。 今後のMicrometer連携も楽しみです。


✒️️ Edit  ⏰ History  🗑 Delete