Metrics Forwarder for PCFを使うと簡単にSpring Boot ActuatorのメトリクスをPCF Metricsに送れます。Pivotal Cloud Foundryユーザーは次のTileをインストールすればこれらが利用可能です。
PCF MetricsはPivotal Web Servicesでも去年から利用可能です。つい最近Metrics Forwarderも利用可能になったので、簡単ですが使い方を紹介します。
目次
- アプリケーションの設定
- Metrics Forwarder Serviceのサービスインスタンス作成
- アプリケーションのデプロイ
- PCF Metricsでメトリクス確認
- カスタムメトリクスの送信
- MicrometerのメトリクスをPCF Metricsに送信
アプリケーションの設定
アプリケーション側は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な機能と言います)。楽チンです。
ちなみに自動で組み込まれるMetrics Writerの実装はhttps://github.com/cloudfoundry/java-buildpack-metric-writerです。
Metrics Forwarder Serviceのサービスインスタンス作成
Marketplaceから"Metrics Forwarder for PCF"を選択してください。
Planを選択してください。どれもfreeですが、Rate Limitの制限が異なります。デモ用途なら4x4000
にしてください。
インスタンス名をここではdemo-metrics-forwarder
にして、ADDをクリックすればMetrics Forwarderのサービスインスタンスが作成されます。
コマンドラインで作成する場合は
cf create-service metrics-forwarder 4x4000 demo-metrics-forwarder
でOK。
アプリケーションのデプロイ
次のようなプロジェクト直下に次のmanifest.yml
を作成し、name
とpath
を環境に合わせて修正してください。
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"をクリックしてください。
デフォルトで次のようなコンテナのメトリクスが取得できます。
"ADD CHART"をクリックすると、メトリクスを追加できます。
"Choose how to aggregate the data across instances"はインスタンス数が2以上の場合で、メトリクスを集約する場合の集約方法です。(view instancesトグルで切り替えられます。集約する場合はトグルをOFF)
- Average ... 全インスタンスの平均値
- Maximum ... 全インスタンスの最大値
- Minimum ... 全インスタンスの最小値
- Total ... 全インスタンスの合計
です。特別なメトリクスでなければ、Couterの場合はTotalをGaugeの場合はAverageを選択すれば良いでしょう。
次のようにSpring Boot Actuatorのメトリクスが表示されます。
カスタムメトリクスの送信
デフォルトでは汎用的なメトリクスのみ取得できます。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.hello
とgauge.insert.elapsed
という名前のメトリクスが追加されます。
これもPCF Metricsで表示可能です。
サンプルコードは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);
}
}
この設定によって、DropwizardMeterRegistry
のcom.codahale.metrics.MetricRegistry
とDropwizardMetricsServices
のそれが共有され、MicrometerのメトリクスがSpring Boot Actuator 1.5のメトリクスに反映されます。そして、Metrics WriterによってMetrics Forwarder Serviceに転送されます。
この設定を含めて再度ビルドしてcf push
することで、PCF MetricsでMicrometerのメトリクス(階層化された名前にリネームされます)
を表示可能になります。
Metrics ForwarderとPCF Metricsを使って、Spring Boot ActuatorのメトリクスをOut of the Boxで表示することができることを紹介しました。 今後のMicrometer連携も楽しみです。