ユニバーサル サービス モニタリング

概要

ユニバーサルサービスモニタリング (USM) は、コードをインスツルメントすることなく、スタック全体にわたって普遍的にサービスのヘルスメトリクスを視覚化することができます。Datadog Agent の構成と統合サービスタグ付けに依存し、インスツルメントされていないサービスのパフォーマンスデータを、サービスカタログ、サービスマップなどのビューに取り込みます。USM は、デプロイ追跡、モニター、ダッシュボード、SLO とも連動しています。

セットアップ

対応バージョンと互換性

必要な Agent のバージョン
ユニバーサルサービスモニタリングでは、コンテナ化されたサービスと共にインストールされる Datadog Agent のバージョンが 6.40 または 7.40 以上であることが必要です。
コンテナ化されたサービスは、以下のサポートされたプラットフォームのいずれかで実行されている必要があります。
Linux Kernel 4.14 以上
CentOS または RHEL 8.0 以上
対応 Windows プラットフォーム
Windows 2012 R2 以降の IIS
対応アプリケーション層プロトコル
HTTP
HTTPS (OpenSSL)
どのようなプラットフォームやプロトコルに対応してほしいかなどのフィードバックがありましたら、サポートまでご連絡ください。

前提条件

  • Linux の場合:
    • サービスがコンテナで動作していること。
  • Windows で IIS を使用する場合:
    • サービスが仮想マシンで動作していること。
  • Datadog Agent がサービスと共にインストールされていること。トレースライブラリのインストールは必要_ありません_。
  • 統合サービスタグ付けenv タグがデプロイメントに適用されていること。serviceversion タグはオプションです。

ユニバーサルサービスモニタリングを有効にする

サービスのデプロイ方法と Agent の構成に応じて、以下のいずれかの方法を使用して、Agent でユニバーサルサービスモニタリングを有効にします。

Datadog チャートバージョン >= 2.26.2 を使用して、以下を values ファイルに追加します。

datadog:
  ...
  serviceMonitoring:
    enabled: true

クラスターで Google Container-Optimized OS (COS) が動作している場合は、values ファイルに以下も追加してください。

providers:
  gke:
    cos: true

Datadog Agent でユニバーサルサービスモニタリングを有効にするには、datadog-agent.yaml マニフェストを更新します。DatadogAgent リソースで spec.features.usm.enabledtrue に設定します。

apiVersion: datadoghq.com/v2alpha1
kind: DatadogAgent
metadata:
  name: datadog
spec:
  global:
    credentials:
     apiSecret:
        secretName: datadog-secret
        keyName: api-key
     appSecret:
      secretName: datadog-secret
      keyName: app-key
  features:
    usm:
      enabled: true

注: Datadog Operator v1.0.0 以降が必要です。

  1. datadog-agent テンプレートにアノテーション container.apparmor.security.beta.kubernetes.io/system-probe: unconfined を追加します。

    spec:
      selector:
        matchLabels:
          app: datadog-agent
      template:
        metadata:
          labels:
            app: datadog-agent
          name: datadog-agent
          annotations:
            container.apparmor.security.beta.kubernetes.io/system-probe: unconfined
    
  2. Agent デーモンセットで以下の環境変数を設定し、ユニバーサルサービスモニタリングを有効にします。Agent プロセスごとにコンテナを実行する場合は、process-agent コンテナに以下の環境変数を追加します。そうでない場合は、agent コンテナに追加します。

    ...
      env:
        ...
        - name: DD_SYSTEM_PROBE_SERVICE_MONITORING_ENABLED
          value: 'true'
        - name: DD_SYSTEM_PROBE_EXTERNAL
          value: 'true'
        - name: DD_SYSPROBE_SOCKET
          value: /var/run/sysprobe/sysprobe.sock
    
  3. 以下の追加ボリュームを datadog-agent コンテナにマウントします。

    ...
    spec:
      serviceAccountName: datadog-agent
      containers:
        - name: datadog-agent
          image: 'gcr.io/datadoghq/agent:latest'
          ...
      volumeMounts:
        ...
        - name: sysprobe-socket-dir
        mountPath: /var/run/sysprobe
    
  4. Agent のサイドカーとして、新しい system-probe コンテナを追加します。

    ...
    spec:
      serviceAccountName: datadog-agent
      containers:
        - name: datadog-agent
          image: 'gcr.io/datadoghq/agent:latest'
          ...
        - name: system-probe
          image: 'gcr.io/datadoghq/agent:latest'
          imagePullPolicy: Always
          securityContext:
            capabilities:
              add:
                - SYS_ADMIN
                - SYS_RESOURCE
                - SYS_PTRACE
                - NET_ADMIN
                - NET_BROADCAST
                - NET_RAW
                - IPC_LOCK
                - CHOWN
          command:
            - /opt/datadog-agent/embedded/bin/system-probe
          env:
            - name: DD_SYSTEM_PROBE_SERVICE_MONITORING_ENABLED
              value: 'true'
            - name: DD_SYSPROBE_SOCKET
              value: /var/run/sysprobe/sysprobe.sock
          resources: {}
          volumeMounts:
            - name: procdir
              mountPath: /host/proc
              readOnly: true
            - name: cgroups
              mountPath: /host/sys/fs/cgroup
              readOnly: true
            - name: debugfs
              mountPath: /sys/kernel/debug
            - name: sysprobe-socket-dir
              mountPath: /var/run/sysprobe
            - name: modules
              mountPath: /lib/modules
              readOnly: true
            - name: src
              mountPath: /usr/src
              readOnly: true
            - name: runtime-compiler-output-dir
              mountPath: /var/tmp/datadog-agent/system-probe/build
            - name: kernel-headers-download-dir
              mountPath: /var/tmp/datadog-agent/system-probe/kernel-headers
              readOnly: false
            - name: apt-config-dir
              mountPath: /host/etc/apt
              readOnly: true
            - name: yum-repos-dir
              mountPath: /host/etc/yum.repos.d
              readOnly: true
            - name: opensuse-repos-dir
              mountPath: /host/etc/zypp
              readOnly: true
            - name: public-key-dir
              mountPath: /host/etc/pki
              readOnly: true
            - name: yum-vars-dir
              mountPath: /host/etc/yum/vars
              readOnly: true
            - name: dnf-vars-dir
              mountPath: /host/etc/dnf/vars
              readOnly: true
            - name: rhel-subscription-dir
              mountPath: /host/etc/rhsm
              readOnly: true
    

    そして、以下のボリュームをマニフェストに追加します。

    volumes:
      - name: sysprobe-socket-dir
        emptyDir: {}
      - name: procdir
        hostPath:
          path: /proc
      - name: debugfs
        hostPath:
          path: /sys/kernel/debug
      - hostPath:
          path: /lib/modules
        name: modules
      - hostPath:
          path: /usr/src
        name: src
      - hostPath:
          path: /var/tmp/datadog-agent/system-probe/build
        name: runtime-compiler-output-dir
      - hostPath:
          path: /var/tmp/datadog-agent/system-probe/kernel-headers
        name: kernel-headers-download-dir
      - hostPath:
          path: /etc/apt
        name: apt-config-dir
      - hostPath:
          path: /etc/yum.repos.d
        name: yum-repos-dir
      - hostPath:
          path: /etc/zypp
        name: opensuse-repos-dir
      - hostPath:
          path: /etc/pki
        name: public-key-dir
      - hostPath:
          path: /etc/yum/vars
        name: yum-vars-dir
      - hostPath:
          path: /etc/dnf/vars
        name: dnf-vars-dir
      - hostPath:
          path: /etc/rhsm
        name: rhel-subscription-dir
    

     : クラスターが Google Container-Optimized OS (COS) 上で動作している場合、src マウントを削除する必要があります。これを行うには、コンテナ定義から以下を削除します。

     - name: src
       mountPath: /usr/src
       readOnly: true
    

    また、マニフェストから以下を削除します。

     - hostPath:
         path: /usr/src
       name: src
    
  5. オプションで HTTPS をサポートする場合は、system-probe コンテナに以下を追加します。

    env:
      - name: HOST_ROOT
        value: /host/root
    volumeMounts:
      - name: hostroot
        mountPath: /host/root
        readOnly: true
    

    そして、以下のボリュームをマニフェストに追加します。

    volumes:
      - name: hostroot
        hostPath:
        path: /
    

docker run コマンドに以下を追加します。

docker run --cgroupns host \
--pid host \
-e DD_API_KEY="<DATADOG_API_KEY>" \
-e DD_SYSTEM_PROBE_SERVICE_MONITORING_ENABLED=true \
-v /var/run/docker.sock:/var/run/docker.sock:ro \
-v /proc/:/host/proc/:ro \
-v /sys/fs/cgroup/:/host/sys/fs/cgroup:ro \
-v /sys/kernel/debug:/sys/kernel/debug \
-v /lib/modules:/lib/modules:ro \
-v /usr/src:/usr/src:ro \
-v /var/tmp/datadog-agent/system-probe/build:/var/tmp/datadog-agent/system-probe/build \
-v /var/tmp/datadog-agent/system-probe/kernel-headers:/var/tmp/datadog-agent/system-probe/kernel-headers \
-v /etc/apt:/host/etc/apt:ro \
-v /etc/yum.repos.d:/host/etc/yum.repos.d:ro \
-v /etc/zypp:/host/etc/zypp:ro \
-v /etc/pki:/host/etc/pki:ro \
-v /etc/yum/vars:/host/etc/yum/vars:ro \
-v /etc/dnf/vars:/host/etc/dnf/vars:ro \
-v /etc/rhsm:/host/etc/rhsm:ro \
-e DD_SYSTEM_PROBE_SERVICE_MONITORING_ENABLED=true \
-e HOST_ROOT=/host/root \
--security-opt apparmor:unconfined \
--cap-add=SYS_ADMIN \
--cap-add=SYS_RESOURCE \
--cap-add=SYS_PTRACE \
--cap-add=NET_ADMIN \
--cap-add=NET_BROADCAST \
--cap-add=NET_RAW \
--cap-add=IPC_LOCK \
--cap-add=CHOWN \
gcr.io/datadoghq/agent:latest

以下を docker-compose.yml ファイルに追加します。

services:
  ...
  datadog:
    ...
    environment:
     - DD_SYSTEM_PROBE_SERVICE_MONITORING_ENABLED='true'
    volumes:
     - /var/run/docker.sock:/var/run/docker.sock:ro
     - /proc/:/host/proc/:ro
     - /sys/fs/cgroup/:/host/sys/fs/cgroup:ro
     - /sys/kernel/debug:/sys/kernel/debug
     - /lib/modules:/lib/modules
     - /usr/src:/usr/src
     - /var/tmp/datadog-agent/system-probe/build:/var/tmp/datadog-agent/system-probe/build
     - /var/tmp/datadog-agent/system-probe/kernel-headers:/var/tmp/datadog-agent/system-probe/kernel-headers
     - /etc/apt:/host/etc/apt
     - /etc/yum.repos.d:/host/etc/yum.repos.d
     - /etc/zypp:/host/etc/zypp
     - /etc/pki:/host/etc/pki
     - /etc/yum/vars:/host/etc/yum/vars
     - /etc/dnf/vars:/host/etc/dnf/vars
     - /etc/rhsm:/host/etc/rhsm
    cap_add:
     - SYS_ADMIN
     - SYS_RESOURCE
     - SYS_PTRACE
     - NET_ADMIN
     - NET_BROADCAST
     - NET_RAW
     - IPC_LOCK
     - CHOWN
    security_opt:
     - apparmor:unconfined

オプションで HTTPS をサポートする場合は、以下も追加します。

services:
  ...
  datadog:
    ...
    environment:
     - HOST_ROOT: '/host/root'
    volumes:
     - /:/host/root:ro

Docker Swarm はまだ security_opt の変更をサポートしていないので、オペレーティングシステムに apparmor インスタンスが動作していない必要があります。

オペレーティングシステムに apparmor インスタンスがない場合は、Docker-Compose セクションにある docker-compose.yml ファイルを security_opt フィールドの横で使用することになります。

Helm Charts や環境変数を使用しない場合は、system-probe.yaml ファイルに以下を設定します。

service_monitoring_config:
  enabled: true

Docker や ECS のインストールでよくあるように、system-probe を環境変数で構成する場合、以下の環境変数を process-agentsystem-probe両方に渡します。

DD_SYSTEM_PROBE_SERVICE_MONITORING_ENABLED=true

ノードに以下の属性を設定します。

node["datadog"]["system_probe"]["service_monitoring_enabled"] = true

service_monitoring_enabled を設定します。

class { 'datadog_agent::system_probe':
    service_monitoring_enabled => true,
}

プレイブックに以下の属性を追加します。

service_monitoring_config:
  enabled: true

ECS の場合、以下の JSON タスク定義で USM とシステムプローブを有効にします。タスク定義をデーモンサービスとしてデプロイします。

{
  "containerDefinitions": [
    {
      "name": "datadog-agent",
      "image": "public.ecr.aws/datadog/agent:7",
      "cpu": 500,
      "memory": 1024,
      "essential": true,
      "mountPoints": [
        ...
        {
          "containerPath": "/sys/kernel/debug",
          "sourceVolume": "sys_kernel_debug"
        },
        {
          "containerPath": "/host/proc",
          "sourceVolume": "proc"
        },
        {
          "containerPath": "/var/run/docker.sock",
          "sourceVolume": "var_run_docker_sock"
        },
        {
          "containerPath": "/host/sys/fs/cgroup",
          "sourceVolume": "sys_fs_cgroup"
        },
        {
          "readOnly": true,
          "containerPath": "/var/lib/docker/containers",
          "sourceVolume": "var_lib_docker_containers"
        },
        {
          "containerPath": "/lib/modules",
          "sourceVolume": "lib_modules"
        },
        {
          "containerPath": "/usr/src",
          "sourceVolume": "usr_src"
        },
        {
          "containerPath": "/var/tmp/datadog-agent/system-probe/build",
          "sourceVolume": "var_tmp_datadog_agent_system_probe_build"
        },
        {
          "containerPath": "/var/tmp/datadog-agent/system-probe/kernel-headers",
          "sourceVolume": "var_tmp_datadog_agent_system_probe_kernel_headers"
        },
        {
          "containerPath": "/host/etc/apt",
          "sourceVolume": "etc_apt"
        },
        {
          "containerPath": "/host/etc/yum.repos.d",
          "sourceVolume": "etc_yum_repos_d"
        },
        {
          "containerPath": "/host/etc/zypp",
          "sourceVolume": "etc_zypp"
        },
        {
          "containerPath": "/host/etc/pki",
          "sourceVolume": "etc_pki"
        },
        {
          "containerPath": "/host/etc/yum/vars",
          "sourceVolume": "etc_yum_vars"
        },
        {
          "containerPath": "/host/etc/dnf/vars",
          "sourceVolume": "etc_dnf_vars"
        },
        {
          "containerPath": "/host/etc/rhsm",
          "sourceVolume": "etc_rhsm"
        }
      ],
      "environment": [
        {
          "name": "DD_API_KEY",
          "value": "<YOUR_DATADOG_API_KEY>"
        },
        ...
        {
          "name": "DD_SYSTEM_PROBE_SERVICE_MONITORING_ENABLED",
          "value": "true"
        }
      ],
      "linuxParameters": {
        "capabilities": {
          "add": [
            "SYS_ADMIN",
            "SYS_RESOURCE",
            "SYS_PTRACE",
            "NET_ADMIN",
            "NET_BROADCAST",
            "NET_RAW",
            "IPC_LOCK",
            "CHOWN"
          ]
        }
      }
    }
  ],
  "requiresCompatibilities": [
    "EC2"
  ],
  "volumes": [
    ...
    {
      "host": {
        "sourcePath": "/sys/kernel/debug"
      },
      "name": "sys_kernel_debug"
    },
    {
      "host": {
        "sourcePath": "/proc/"
      },
      "name": "proc"
    },
    {
      "host": {
        "sourcePath": "/var/run/docker.sock"
      },
      "name": "var_run_docker_sock"
    },
    {
      "host": {
        "sourcePath": "/sys/fs/cgroup/"
      },
      "name": "sys_fs_cgroup"
    },
    {
      "host": {
        "sourcePath": "/var/lib/docker/containers/"
      },
      "name": "var_lib_docker_containers"
    },
    {
      "host": {
        "sourcePath": "/lib/modules"
      },
      "name": "lib_modules"
    },
    {
      "host": {
        "sourcePath": "/usr/src"
      },
      "name": "usr_src"
    },
    {
      "host": {
        "sourcePath": "/var/tmp/datadog-agent/system-probe/build"
      },
      "name": "var_tmp_datadog_agent_system_probe_build"
    },
    {
      "host": {
        "sourcePath": "/var/tmp/datadog-agent/system-probe/kernel-headers"
      },
      "name": "var_tmp_datadog_agent_system_probe_kernel_headers"
    },
    {
      "host": {
        "sourcePath": "/etc/apt"
      },
      "name": "etc_apt"
    },
    {
      "host": {
        "sourcePath": "/etc/yum.repos.d"
      },
      "name": "etc_yum_repos_d"
    },
    {
      "host": {
        "sourcePath": "/etc/zypp"
      },
      "name": "etc_zypp"
    },
    {
      "host": {
        "sourcePath": "/etc/pki"
      },
      "name": "etc_pki"
    },
    {
      "host": {
        "sourcePath": "/etc/yum/vars"
      },
      "name": "etc_yum_vars"
    },
    {
      "host": {
        "sourcePath": "/etc/dnf/vars"
      },
      "name": "etc_dnf_vars"
    },
    {
      "host": {
        "sourcePath": "/etc/rhsm"
      },
      "name": "etc_rhsm"
    }
  ],
  "family": "datadog-agent-task"
}

OS のイメージが Ubuntu や Debian の場合は、environment の後に以下を追加してください。

"dockerSecurityOptions": [
  "apparmor:unconfined"
]

オプションで HTTPS をサポートする場合は、以下も追加します。

"mountPoints": [
  ...
  {
    "containerPath": "/host/root",
    "sourceVolume": "host_root"
  },
  ...
]
...
"volumes": [
  ...
  {
    "host": {
      "sourcePath": "/"
    },
    "name": "host_root"
  },
  ...
]

サービスでロードバランサーを使用している場合、ユニバーサルサービスモニタリングがクラウド管理されたエンティティを検出できるように、追加のクラウドインテグレーションを有効にします。

  • AWS ロードバランサーを可視化するには、AWS インテグレーションをインストールします。また、ENI および EC2 のメトリクス収集を有効にする必要があります。

次に、各ロードバランサーに以下のタグを追加します。

ENV=<env>
SERVICE=<service>

IIS 上で動作するサービスの場合:

  1. ネットワークドライバーコンポーネントを有効にして、Datadog Agent (バージョン 6.41 または 7.41 以降) をインストールします。インストール中、msiexec コマンドに ADDLOCAL="MainApplication,NPM" を渡すか、UI から Agent のインストールを実行するときに Network Performance Monitoring を選択します。

  2. C:\ProgramData\Datadog\system-probe.yaml を編集し、有効フラグを true に設定します。

    service_monitoring_config:
      enabled: true
    

自動サービスタグ付け

ユニバーサルサービスモニタリングは、インフラストラクチャーで稼働しているサービスを自動的に検出します。統合サービスタグ付けが見つからない場合、タグの 1 つ (appshort_imagekube_container_namecontainer_namekube_deploymentkube_service) に基づいて名前を付けます。

サービス名を更新するには、統合サービスタグ付けを設定します。

Datadog がサービスを自動検出すると、その際に使用されるタグがサービスページの上部に表示されます

サービスの確認

Agent を構成した後、サービスカタログにサービスが表示されるまで約 5 分間待ちます。サービスをクリックすると、サービスの詳細ページが表示されます。左上の操作名 universal.http.server または universal.http.client は、サービスのテレメトリーがユニバーサルサービスモニタリングから来ることを示します。

universal.http.server という操作名で、サービスへのインバウンドトラフィックのヘルスメトリクスを取得します。対応する universal.http.client 操作名は、他の宛先へのアウトバウンドトラフィックを表します。

Services タブの operation ドロップダウンメニューには、利用可能な操作名が表示されます

ユニバーサルサービスモニタリングを有効にすると、次のことが可能になります。

パスの除外と置換

http_replace_rules または DD_SYSTEM_PROBE_NETWORK_HTTP_REPLACE_RULES を使用して、正規表現にマッチする HTTP エンドポイントを削除したり、マッチするエンドポイントを異なる形式に変換するように Agent を構成します。

system-probe に以下の構成を追加します。

network_config:
  http_replace_rules:
    - pattern: "<exclusion rule>"
      repl: ""
    - pattern: "<replacement rule>"
      repl: "<new format>"

例えば、以下の構成では /api/v1/users のような /api/ で始まるエンドポイントを削除します。しかし、/api/users/api は無視されません。

network_config:
  http_replace_rules:
    - pattern: "/api/.*"
      repl: ""

以下の構成は、エンドポイント /api/users を新しいフォーマット /api/v1/users に合わせて置き換えたものです。

network_config:
  http_replace_rules:
    - pattern: "/api/users"
      repl: "/api/v1/users"

次のエントリーを追加します。

DD_SYSTEM_PROBE_NETWORK_HTTP_REPLACE_RULES=[{"pattern":"<drop regex>","repl":""},{"pattern":"<replace regex>","repl":"<replace pattern>"}]

その他の参考資料