コンポーネントにカスタムチャートを追加する

概要

SUSE® Observabilityは、Kubernetesリソースを表すほとんどのタイプのコンポーネントに対して、デフォルトで多くのメトリックチャートを提供します。必要に応じて、任意のコンポーネントセットに追加のメトリックチャートを追加できます。コンポーネントにメトリックを追加する際には、2つのオプションがあります:

  1. メトリックはすでにSUSE® Observabilityによって収集されていますが、デフォルトではコンポーネントに視覚化されていません。

  2. メトリックはまだSUSE® Observabilityによって収集されておらず、したがってまだ利用できません。

オプション1の場合、以下の手順に従って、特定のメトリックを特定のコンポーネントセットに追加するようにSUSE® Observabilityを構成するメトリックバインディングを作成する方法を説明します。

オプション2の場合、SUSE® Observabilityでメトリックが利用可能であることを確認し、SUSE® ObservabilityにPrometheusリモート書き込みプロトコルを使用して送信します。メトリックが利用可能であることを確認した後にのみ、コンポーネントにメトリックのチャートを追加してください。

メトリックバインディングの作成

例として、これらの手順では、Kubernetesデプロイメントの`Replica counts`にメトリックバインディングを追加します。このメトリックバインディングは、デフォルトでSUSE® Observabilityに既に存在します。

メトリックバインディングの概要を作成する

お気に入りのコードエディタで`metricbindings.yaml` YAMLファイルを開いて、このガイド全体で変更してください。 CLIを使用してスタックパックをテストすることができます。

- _type: MetricBinding
  chartType: line
  enabled: true
  identifier: urn:stackpack:my-stackpack:shared:metric-binding:node-memory-bytes-available-scheduling
  layout:
    metricPerspective:
      section: Resources
      tab: Kubernetes Node
  name: Memory available for scheduling (Custom)
  priority: medium
  queries:
  - alias: ${cluster_name} - ${node}
    expression: max_over_time(kubernetes_state_node_memory_allocatable{cluster_name="${tags.cluster-name}", node="${name}"}[${__interval}])
  scope: (label = "stackpack:kubernetes" and type = "node")
  unit: bytes(IEC)

クエリとスコープのセクションは、次のステップで記入されます。使用される単位は`short`であり、これは単に数値を表示します。メトリックの単位についてまだ確信がない場合は、オープンにしておき、PromQLクエリを書く際に正しい単位を決定できます。

バインドするコンポーネントを選択する

トポロジーの視点のビューを保存し、フィルター(フィルター→トポロジー→STQLに切り替え)を使用して、新しいメトリックを表示する必要があるコンポーネントをクエリします。メトリックバインディングのためにトポロジーを選択する際に最も一般的なフィールドは、コンポーネントタイプのための`type`と、すべてのラベルを選択するための`label`です。例えば、デプロイメントの場合:

type = "deployment" and label = "stackpack:kubernetes"

タイプフィルターはすべてのデプロイメントを選択し、ラベルフィルターはKubernetesスタックパックによって作成されたコンポーネントのみを選択します(ラベル名は`stackpack`で、ラベル値は`kubernetes`です)。後者を省略しても同じ結果が得られます。 すべてのSTQLクエリコンポーネントフィルターはフィルタリングに使用できます。

高度なモードに切り替えて、結果のトポロジークエリをコピーし、メトリックバインディングの`scope`フィールドに貼り付けてください。

メトリックバインディングは、クエリフィルターのみをサポートします。`withNeighborsOf`のようなクエリ関数はサポートされておらず、使用できません。

PromQLクエリを書いてください。

SUSE® Observabilityインスタンスのメトリックエクスプローラーに移動し、http://your-instance/#/metrics,を使用して関心のあるメトリックを調べてください。エクスプローラーはメトリック、ラベル、ラベル値、さらにPromQL関数や演算子の自動補完を提供します。最良の結果を得るために、例えば1時間の短い時間範囲から始めてください。

レプリカの総数には`kubernetes_state_deployment_replicas`メトリックを使用してください。時系列データのメトリックチャートを表示するには、`${__interval}`パラメータを使用して集約を行うようにクエリを拡張してください:

max_over_time(kubernetes_state_deployment_replicas[${__interval}])

この特定のケースでは、チャートが常に任意の時点でのレプリカの最大数を表示することを確認するために`max_over_time`を使用してください。長い時間範囲では、一時的なレプリカ数の低下は表示されません。レプリカの最小数を強調するために、代わりに`min_over_time`を使用してください。

クエリをメトリックバインディングの`queries`フィールドの最初のエントリの`expression`プロパティにコピーしてください。`Total replicas`をエイリアスとして使用してください。そうすると、チャートの凡例に表示されます。

SUSE® Observabilityでは、メトリックチャートのサイズがチャートに表示されるメトリックの粒度を自動的に決定します。PromQLクエリは、この動作を最適に利用してメトリックの代表的なチャートを取得するように調整できます。チャートのためのPromQLの書き方がこれを詳しく説明しています。

各コンポーネントに正しい時系列をバインドします。

すべてのフィールドが埋められたメトリックバインディング:

_type: MetricBinding
chartType: line
enabled: true
tags: {}
unit: short
name: Replica counts
priority: MEDIUM
identifier: urn:stackpack:my-stackpack:metric-binding:my-deployment-replica-counts
queries:
  - expression: max_over_time(kubernetes_state_deployment_replicas[${__interval}])
    alias: Total replicas
scope: type = "deployment" and label = "stackpack:kubernetes"

SUSE® Observabilityでこれを作成し、デプロイメントコンポーネントの「レプリカ数」チャートを表示すると、予期しない結果が得られます。チャートはすべてのデプロイメントのレプリカ数を示しています。論理的には、特定のデプロイメントのレプリカ数という1つの時系列のみが期待されます。

単一デプロイメントの不正確なチャート

これを修正するには、コンポーネントの情報を使用してPromQLクエリをコンポーネント固有のものにしてください。コンポーネントの特定の時系列のみを選択するために、十分なメトリックラベルでフィルタリングします。これがコンポーネントに正しい時系列をバインドする「バインディング」です。Grafanaダッシュボードの作成に経験がある方には、これはダッシュボードのクエリで使用されるパラメータを持つダッシュボードに似ています。メトリックバインディングのクエリを次のように変更しましょう:

max_over_time(kubernetes_state_deployment_replicas{cluster_name="${tags.cluster-name}", namespace="${tags.namespace}", deployment="${name}"}[${__interval}])
パラメータ化されたフィルタを追加した後、結果のチャートは期待通りに見えます

PromQLクエリは現在、cluster_namenamespace、および`deployment`の3つのラベルでフィルタリングします。これらのラベルに対して実際の値を指定する代わりに、コンポーネントのフィールドへの変数参照が使用されます。この場合、ラベル`cluster-name`と`namespace`が使用され、${tags.cluster-name}`と${tags.namespace}`を使用して参照されます。さらに、コンポーネント名は`${name}`で参照されます。

サポートされている変数参照は次のとおりです:

  • 任意のコンポーネントラベルを使用して、${tags.<label-name>}

  • コンポーネント名を使用して、${name}

コンポーネントハイライトページは、ラベルとコンポーネント名(両方とも赤で強調表示)を表示します

クラスター名、ネームスペース、およびコンポーネントタイプと名前の組み合わせは、Kubernetesから特定のコンポーネントのメトリクスを選択するのに通常十分です。これらのラベル、または類似のラベルは、通常、ほとんどのメトリクスおよびコンポーネントで利用可能です。

詳細

チャートに1つ以上の時系列が存在します。

メトリックバインディングには1つのユニットしかありません(チャートのy軸にプロットされます)。その結果、1つのメトリックバインディング内で同じユニットの時系列を生成するクエリのみを組み合わせるべきです。時には単位を変換することが可能な場合もあります。例えば、CPU使用率はミリコアまたはコアで報告されることがあります。ミリコアは1000倍することでコアに変換できます。`(<original-query>) * 1000`のように。

1つのメトリックバインディング、したがって1つのチャートに1つ以上の時系列を取得する方法は2つあります:

  1. 単一のコンポーネントに対して複数の時系列を返すPromQLクエリを書く。

  2. メトリックバインディングにさらにPromQLクエリを追加する。

最初のオプションの例は、次のセクションに示されています。2番目のオプションは、関連するメトリックを比較するのに役立ちます。いくつかの典型的なユースケース:

  • 合計レプリカ数と希望および利用可能なレプリカ数の比較。

  • リソース使用量:制限、リクエスト、および単一のチャート内の使用量。

メトリックバインディングにさらにクエリを追加するには、ステップの3と4を繰り返し、クエリをクエリのリストに追加します。デプロイメントレプリカ数には、同じチャートに含めることができるいくつかの関連メトリックがあります:

- _type: MetricBinding
  chartType: line
  enabled: true
  tags: {}
  unit: short
  name: Replica counts
  priority: MEDIUM
  identifier: urn:stackpack:my-stackpack:metric-binding:my-deployment-replica-counts
  queries:
    - expression: max_over_time(kubernetes_state_deployment_replicas{cluster_name="${tags.cluster-name}", namespace="${tags.namespace}", deployment="${name}"}[${__interval}])
      alias: Total replicas
    - expression: max_over_time(kubernetes_state_deployment_replicas_available{cluster_name="${tags.cluster-name}", namespace="${tags.namespace}",  deployment="${name}"}[${__interval}])
      alias: Available - ${cluster_name} - ${namespace} - ${deployment}
    - expression: max_over_time(kubernetes_state_deployment_replicas_unavailable{cluster_name="${tags.cluster-name}", namespace="${tags.namespace}",  deployment="${name}"}[${__interval}])
      alias: Unavailable - ${cluster_name} - ${namespace} - ${deployment}
    - expression: min_over_time(kubernetes_state_deployment_replicas_desired{cluster_name="${tags.cluster-name}", namespace="${tags.namespace}",  deployment="${name}"}[${__interval}])
      alias: Desired - ${cluster_name} - ${namespace} - ${deployment}
  scope: type = "deployment" and label = "stackpack:kubernetes"
複数のメトリックを持つメトリックバインディング

エイリアスにメトリックラベルを使用する。

単一のクエリがコンポーネントごとに複数の時系列を返す場合、これはチャートに複数のラインとして表示されます。しかし、凡例ではすべて同じエイリアスが使用されます。異なる時系列の違いを確認できるように、エイリアスには`${label}`構文を使用してメトリックラベルへの参照を含めることができます。例えば、ここにポッドの「コンテナ再起動」メトリックのメトリックバインディングの例があります。ポッドには複数のコンテナがあることに注意してください:

type: MetricBinding
chartType: line
enabled: true
id: -1
identifier: urn:stackpack:my-stackpack:metric-binding:my-pod-restart-count
name: Container restarts
priority: MEDIUM
queries:
- alias: Restarts - ${container}
  expression: max by (cluster_name, namespace, pod_name, container) (kubernetes_state_container_restarts{cluster_name="${tags.cluster-name}", namespace="${tags.namespace}", pod_name="${name}"})
scope: (label = "stackpack:kubernetes" and type = "pod")
unit: short

alias`はメトリックの`container`ラベルを参照していることに注意してください。クエリ結果にラベルが存在することを確認してください。ラベルが欠落している場合、${container}`はトラブルシューティングの助けとなるようにリテラルテキストとして表示されます。

レイアウト

各コンポーネントは、k8s、ネットワーキング、ランタイム環境(例:JVM)、プロトコル(HTTP、AMQP)など、さまざまな技術やプロトコルに関連付けることができます。 その結果、各コンポーネントに対して多くの異なるメトリックが表示される可能性があります。読みやすさを向上させるために、SUSE® Observabilityはこれらのチャートをタブやセクションに整理できます。 特定のタブやセクション内にチャート(MetricBinding)を表示するには、レイアウトプロパティを設定する必要があります。 指定されたレイアウトのないMetricsBindingは、`Other`という名前のタブとセクションに表示されます。

こちらが設定の例です: