---
title: Metrics Forwarder Serviceを使ってSpring Boot ActuatorのメトリクスをPWS/PCFに送る
tags: ["Cloud Foundry", "Pivotal Web Services", "Pivotal Cloud Foundry", "Spring Boot", "Java", "Metrics Forwarder", "PCF Metrics", "Micrometer"]
categories: ["Programming", "Java", "org", "springframework", "boot"]
date: 2017-10-29T15:36:07Z
updated: 2017-11-05T17:41:04Z
---
[Metrics Forwarder for PCF](https://docs.pivotal.io/metrics-forwarder/index.html)を使うと簡単にSpring Boot Actuatorのメトリクスを[PCF Metrics](https://docs.pivotal.io/pcf-metrics/1-4/index.html)に送れます。Pivotal Cloud Foundryユーザーは次のTileをインストールすればこれらが利用可能です。
* https://network.pivotal.io/products/apm
* https://network.pivotal.io/products/p-metrics-forwarder
PCF Metricsは[Pivotal Web Services](https://run.pivotal.io)でも去年から[利用可能](https://metrics.run.pivotal.io/)です。つい最近Metrics Forwarderも[利用可能](https://console.run.pivotal.io/marketplace/services/f4532de3-af6d-4fc9-8dbe-f86fa06711ec)になったので、簡単ですが使い方を紹介します。
**目次**
### アプリケーションの設定
アプリケーション側は`spring-boot-starter-actuator`を入れるだけです。
``` xml
org.springframework.boot
spring-boot-starter-actuator
```
一般的にSpring Boot Actuatorのメトリクスを外部に送信しするには[Metrics Writer](https://docs.spring.io/spring-boot/docs/1.5.x/reference/html/production-ready-metrics.html#production-ready-metric-writers)を設定する必要があります。例えばRedisに送信する場合は次の設定を行います。
``` java
@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](https://github.com/cloudfoundry/java-buildpack-metric-writer)です。
### Metrics Forwarder Serviceのサービスインスタンス作成
[Marketplace](https://console.run.pivotal.io/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`を環境に合わせて修正してください。
``` yml
applications:
- name:
buildpack: java_buildpack
memory: 1g
path: target/-0.0.1-SNAPSHOT.jar
services:
- demo-metrics-forwarder
```
あとは
```
cf push
```
でデプロイしてください。起動時のログにMetric Writerのインストールログが出力されることを確認されることを確認してください。
### PCF Metricsでメトリクス確認
[Apps Manager](https://console.run.pivotal.io/)からデプロイしたアプリケーションの画面に行き、"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`をインジェクションしてからメトリクスを設定してください。
``` java
@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](https://github.com/making/demo-metrics-forwarder)です。
> ちなみにMetrics Forwarder Service自体はSpring Boot専用ではなく、buildpackによって自動で組み込まれるMetrics Writerが[HTTP API](http://docs.pivotal.io/metrics-forwarder/api)に対してPOSTしているだけです。このエンドポイントにメトリクスを送信できれば、任意の言語でも利用可能です。Go言語からこのメトリクスを送信するには[https://github.com/pivotal-cf/go-metrics-pcf](https://github.com/pivotal-cf/go-metrics-pcf)を使用してください。
### MicrometerのメトリクスをPCF Metricsに送信
Spring Boot 2からSpring Boot Actuatorのメトリクスは大幅に変更されます。独自のメトリクスフォーマットが[Micrometer](https://micrometer.io)に置き換わります。
現時点ではCloud FoundryのMetrics WriterはSpring Boot 2には未対応ですが、今後Micrometerに[対応予定](https://github.com/cloudfoundry/java-buildpack-metric-writer/issues/2)です。
ここではMicrometerのSpring 1.5サポート([micrometer-spring-legacy](https://github.com/micrometer-metrics/micrometer/tree/master/micrometer-spring-legacy))を使って、MicrometerのメトリクスをMetrics Forwarder Serviceを経由して、PCF Metricsに送信します。
試してみたところ、MicrometerのDropwizardメトリクスラッパーである`io.micrometer.core.instrument.dropwizard.DropwizardMeterRegistry`とSpring Boot Actuatorの[`DropwizardMetricsServices`](https://docs.spring.io/spring-boot/docs/1.5.x/reference/html/production-ready-metrics.html#production-ready-dropwizard-metrics)を連携すれば簡単に送信可能でした。
`pom.xml`に次の依存ライブラリを設定します。ここでは`DropwizardMeterRegistry`の実装ライブラリとして`micrometer-registry-jmx`を使用します。
``` xml
1.0.0-rc.3
io.micrometer
micrometer-spring-legacy
${micrometer.version}
io.micrometer
micrometer-registry-jmx
${micrometer.version}
spring-milestones
Spring Milestones
https://repo.spring.io/milestone
false
```
次のようなJava Configを作成してください。
``` java
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](https://micrometer.io/)連携も楽しみです。