Overview

Loomはメトリクスを備えており、外部のモニタリングサービスにメトリクス値を公開している。 ミドルウェアレイヤーは、アプリケーションのサービスとインストゥルメント化間の関心の分離を可能にするために導入される。 Loom SDKは、go-kitのmetricsパッケージを利用してメトリクスを備えている。

Loom SDKのメトリクス

Loomは4つの異なるタイプのメトリクスをキャプチャ及び公開している:

  • Counter 単一の数値。増えることだけ可能。
  • Gauge 単一の数値で増減が可能。
  • Histogram スライディングタイムウインドウのバケットにグループ分けされた観察サンプル。
  • Summary スライディングタイムウインドウのバケットに、分位点でグループ分けされた観察サンプル。

以下のGoコードは、go-kitを用いたLoomのメトリクス作成方法の例を示している。 Namespaceloomchainの前に書かれている。 Subsystemquery_serviceもしくはbackend_service*のどちらも可能だ。

例えば、requestCounterのメトリックキーはloomchain_query_service_request_count、及び requestLatencyのメトリックキーはloomchain_query_service_request_latency_microsecondsというふうに参照される。 全てのキーは唯一のものであり同じものはない。

fieldKeys := []string{"method", "error"}
requestCount := kitprometheus.NewCounterFrom(stdprometheus.CounterOpts{
    Namespace: "loomchain",
    Subsystem: "query_service",
    Name:      "request_count",
    Help:      "Number of requests received.",
}, fieldKeys)
requestLatency := kitprometheus.NewSummaryFrom(stdprometheus.SummaryOpts{
    Namespace: "loomchain",
    Subsystem: "query_service",
    Name:      "request_latency_microseconds",
    Help:      "Total duration of requests in microseconds.",
}, fieldKeys)

またLoomはメトリック値のバリエーションを作成するために、各メトリックに2つの異なるフィールド名も提供する。 まずmethodだが、これはメソッドコールの名称だ。 次にerrorだが、これはメソッドコールがエラーを返す場合にtrueとなる。

以下は異なるフィールドで公開されているメトリクスの例である。

loomchain_query_service_request_count{error="false",method="Nonce"} 
loomchain_query_service_request_count{error="true",method="Nonce"} 
loomchain_query_service_request_count{error="false",method="Query"}
loomchain_query_service_request_count{error="true",method="Query"}

メトリックのエンドポイント

loom runコマンドを使用してスマートコントラクトを実行する際、デフォルトのメトリクスのエンドポイントは127.0.0.1:46658/metricsである。 このエンドポイントは、設定ファイル中の設定キーRPCBindAddressを使って設定可能だ。

httpクライアントやwebブラウザを使用して、エンドポイントからメトリクスをポーリングすることが可能だ。127.0.0.1:46658で動いているサーバーは、リクエストのカウントとレイテンシーのメトリクスを以下のように示す。

curl 127.0.0.1:46658/metrics

# HELP loomchain_query_service_request_count 受け取ったリクエスト数。
# TYPE loomchain_query_service_request_count counter
loomchain_query_service_request_count{error="false",method="Nonce"} 2
loomchain_query_service_request_count{error="true",method="Query"} 2
# HELP loomchain_query_service_request_latency_microseconds ミリ秒単位での全リクエストの合計時間。
# TYPE loomchain_query_service_request_latency_microseconds summary
loomchain_query_service_request_latency_microseconds{error="false",method="Nonce",quantile="0.5"} 1.0352e-05
loomchain_query_service_request_latency_microseconds{error="false",method="Nonce",quantile="0.9"} 2.4728e-05
loomchain_query_service_request_latency_microseconds{error="false",method="Nonce",quantile="0.99"} 2.4728e-05
loomchain_query_service_request_latency_microseconds_sum{error="false",method="Nonce"} 3.508e-05
loomchain_query_service_request_latency_microseconds_count{error="false",method="Nonce"} 2
loomchain_query_service_request_latency_microseconds{error="true",method="Query",quantile="0.5"} 1.5574e-05
loomchain_query_service_request_latency_microseconds{error="true",method="Query",quantile="0.9"} 1.7501e-05
loomchain_query_service_request_latency_microseconds{error="true",method="Query",quantile="0.99"} 1.7501e-05
loomchain_query_service_request_latency_microseconds_sum{error="true",method="Query"} 3.3075000000000004e-05
loomchain_query_service_request_latency_microseconds_count{error="true",method="Query"} 2

メトリクスのモニタリング

Loomはメトリクスを格納しないのだが、その時点でのメトリック値の公開のみ行なっている。 メトリクスの取得には、エンドポイントからモニタリングシステムへメトリクスのポーリングを行うか、もしくはPrometheusを使用することもできる。

またGrafanaKibanaのようなツールを使用して、メトリクスを可視化することもできる。

Prometheus

Prometheusサーバーを設定するために、以下を設定ファイルに追加しよう:

scrape_configs:

  - job_name: "loomchain"
    metrics_path: "/metrics"
    scrape_interval: "2s"
    static_configs:
    - targets:
      - 127.0.0.1:46658 # The IP address to the query server host

全メトリクスのリスト

以下はLoom SDKによって公開されるメトリクスのリストだ:

メトリクス タイプ 説明
loomchain_query_service_request_count Counter 受け取ったクエリリクエスト数
loomchain_query_service_request_latency_microseconds Summary ミリ秒単位でのクエリリクエストの合計時間