Kubernetes上のシステムのメトリクスをPrometheusで収集し、New Relicに統合してみる

[New Relic Advent Calendar 2019](https://qiita.com/advent-calendar/2019/newrelic)の21日目の投稿になります。（体調不良で投稿が随分遅れてしまいました。。）

# はじめに

弊社のプロダクトではデータ転送の基盤をKubernetes（EKS）で構築しております。
データ転送は [Jobs](https://kubernetes.io/docs/concepts/workloads/controllers/jobs-run-to-completion/) で行っております。

インフラやアプリケーションのモニタリングにはNew Relicを利用しています。メトリクスの収集には[Prometheus](https://prometheus.io/)を使用しています。

今回はKubernetes上のシステムのメトリクスをPrometheusで収集し、New Relicに統合するところまでを紹介したいと思います。

# Prometheusとnew relicの連携について

KubernetesとNew Relicの連携は[New Relic Prometheus OpenMetrics](https://docs.newrelic.com/docs/integrations/prometheus-integrations/get-started/new-relic-prometheus-openmetrics-integration-kubernetes)を利用します。
監視対象のPrometheusエンドポイントを自動的に識別し、メトリックを収集を可能にするものです。収集したメトリクスはNew Relic Insightsによって可視化します。

![prometheus-kubernetes.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215051/6bcadc32-c2ea-0f7c-e221-190fc05a1973.png)


# やり方

Kubernetes上にNew Relic Prometheus OpenMetricsを導入する方法としては[こちら](https://docs.newrelic.com/docs/integrations/prometheus-integrations/install-configure/install-update-or-uninstall-your-prometheus-openmetrics-integration)を参照してください。

基本的にはNew Relicが提供しているmanifest fileにNew Relicのライセンスキーやクラスタ名を入力し、applyするだけで導入可能です。

導入が完了すると下記のようにNew Relic Prometheus OpenMetricsのPod（`nri-prometheus-78888747d7-gxkrd`）が立ち上がります。

```
kubectl get pod -n kube-system
NAME                                 READY   STATUS    RESTARTS   AGE
aws-node-j825j                       1/1     Running   0          63m
aws-node-qmr56                       1/1     Running   0          4m
cluster-autoscaler-779c8bfb8-zvcxx   1/1     Running   0          25m
coredns-57db5788d5-968pj             1/1     Running   0          25m
coredns-57db5788d5-nrjpk             1/1     Running   0          25m
fluentd-7ft2n                        1/1     Running   0          63m
fluentd-p48g5                        1/1     Running   0          3m40s
kube-proxy-cktvq                     1/1     Running   0          63m
kube-proxy-htwgh                     1/1     Running   0          4m
kube-state-metrics-d6c99df65-9p8qk   2/2     Running   0          25m
nri-prometheus-78888747d7-gxkrd      1/1     Running   0          25m
```

収集対象のPrometheusエンドポイントを識別させる方法は主には2つです。

1. Deploymentにラベルを与えることで自動で識別させる

下記のようにDeploymentのtemplateのlabelに `prometheus.io`  をあたえることで識別可能になります。下記の例では9394ポートのmetricsにアクセスすることでメトリクス収集が可能になるように設定しています。

```
apiVersion: apps/v1
kind: Deployment
spec:

  ・
  ・
  ・

  template:
    metadata:
      labels:
        prometheus.io/scrape: "true"
        prometheus.io/port: "9394"
        prometheus.io/path: "metrics"
```

2. PrometheusエンドポイントのURLをconfigのターゲットに設定する。

New Relic Prometheus OpenMetricsのmanifestファイルのconfig.yaml内に固定URLを設定可能な項目があるので、そこにエンドポイントの情報を記載する


```
---
apiVersion: v1
kind: ServiceAccount
metadata:
  name: nri-prometheus


・
・
・

apiVersion: v1
data:
  config.yaml: |

    ・
    ・
    ・

    targets:
      - description: trocco app
        urls: ["http://sample.com:9394/metrics", "http://sample.com:9100/metrics"]
```

こうすることでPrometheusで収集したメトリクスをNew Relicに連携することが可能になります。

# 収集したメトリクスの可視化

収集したメトリクスはNew Relic Insightによって可視化が可能です。
[NRQL](https://newrelic.degica.com/docs/insights/nrql-new-relic-query-language/nrql-resources/nrql-syntax-components-functions)のクエリで必要なデータを抽出し、可視化、アラートの設定をします。以下は収集したメトリクスを可視化した例になります。

<img width="1452" alt="スクリーンショット 2019-12-23 22.08.59.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215051/12240ac9-3f79-ada9-6b62-e28d511386af.png">


本日はKubernetes上のシステムのメトリクスをPrometheusで収集し、New Relicに統合するところを紹介しました。まだまだNew Relicは触って1ヶ月程度でありますが、色々とやれることが多く楽しいです。これからどんどん使いこなして行きたいと思います。

最後までご覧いただき、ありがとうございました！