Stackdriver Logging을 Datadog Logs로 전송하여 Terraform에서 알림 설정

Stackdriver에서 오류 로그 알림 을 설정해 보았지만, 히트 한 행이 Slack 통지에 표시되지 않기 때문에 사용하기 어려웠다.

Datadog Logs의 통지라면 에러 로그를 Slack 통지에 표시할 수 있다. 따라서 Stackdriver Logging에 들어있는 로그를 Datadog Logs로 전송하여 오류 알림을 시도한 기록



cite : htps : // / cs. 다만 ghq. 코 m / 모토와 rs / 모토와 r_ty ぺ s / ぉ g / # 치후 ぃ 카치 온 s an d ぉ g mp ぇ s

Stackdriver Logging을 Datadog Logs로 전송



See htps : // / cs. 다만 ghq. 코 m / 이니 g 라치 온 s / 오 오 g ぇ_ c ぉ d d p t t rm / # ぉ g ぇ c 치 온
  • Create a new Cloud Pub/Sub.
  • Validate your Datadog domain so that logs can be pushed from GCP to Datadog.
  • Setup the Pub/Sub to forward logs to Datadog.
  • Configure exports from Stackdriver logs to the Pub/Sub.

  • 이 중 2단계의 Cloud Search Console 및 Domain Verification 설정은 수동으로 수행할 수 없으므로 htps : // / cs. 다만 ghq. 코 m / 글쎄 g 라치 온 s / 굿 문서를 참조하여 수동으로 수행합니다.

    1, 3, 4 의 Pub/Sub 및 Cloud Logging Sink 의 설정은 Terraform 화할 수 있었으므로, .tf 파일을 나타내 둡니다. 예를 들어 k8s_pod 로그를 Datadog Logs로 전송하는 설정은 다음과 같습니다.
    resource "google_pubsub_topic" "export-logs-to-datadog" {
      name = "export-logs-to-datadog"
    }
    
    resource "google_pubsub_subscription" "export-logs-to-datadog" {
      name  = "export-logs-to-datadog"
      topic = "${google_pubsub_topic.export-logs-to-datadog.name}"
    
      push_config {
        # NOTE: Need to do domain verification. See https://docs.datadoghq.com/integrations/google_cloud_platform/#validate-the-datadog-domain
        push_endpoint = "https://gcp-intake.logs.datadoghq.com/v1/input/${var.datadog_api_key}"
      }
    
      depends_on = ["google_pubsub_topic.export-logs-to-datadog"]
    }
    
    # Tips: If you have a configuration error, the web console https://console.cloud.google.com/logs/exports?project=<project_id>
    # will show a warning after waiting 10 sec at there.
    resource "google_logging_project_sink" "export-logs-to-datadog" {
      name        = "export-logs-to-datadog"
      destination = "pubsub.googleapis.com/projects/${var.project}/topics/${google_pubsub_topic.export-logs-to-datadog.name}"
    
      # Add more resource.type with OR if you want to get more
      filter                 = "resource.type=\"k8s_pod\""
      unique_writer_identity = true
    
      depends_on = ["google_pubsub_topic.export-logs-to-datadog"]
    }
    
    resource "google_pubsub_topic_iam_member" "export-logs-to-datadog" {
      topic  = "${google_pubsub_topic.export-logs-to-datadog.name}"
      role   = "roles/pubsub.publisher"
      member = "${google_logging_project_sink.export-logs-to-datadog.writer_identity}"
    
      depends_on = [
        "google_pubsub_topic.export-logs-to-datadog",
        "google_logging_project_sink.export-logs-to-datadog",
      ]
    }
    
    https://console.cloud.google.com/logs/exports?project=<your_project_id> 에서 Stackdriver Logging Sink 화면을 열고 10 sec 정도 기다려 warning 이 나오지 않으면 성공하고 있을 것이다.

    Datadog > Logs > Search 화면에서 Source를 gcp.k8s.pod로 하여 로그가 들어오고 있는 것을 확인할 수 있으면 OK.

    Datadog Logs의 Pipeline 설정



    이 상태에서 Datadog Logs의 통지 설정을 해도 Message가 통지에 포함되지 않았다.



    Datadog에서 특별한 의미를 가지는 Message 필드를 별도로 설정해 줄 필요가 있는 것 같다.

    를 참고로 Logs > Configuration > Pipeline 에서 Reserved attributes mapping 을 설정해, JSON payload 의 로그 통지에 포함시키고 싶은 캐릭터 라인을 가지는 필드 data.jsonPayload.messageMessage 속성에 지정. 자주(잘) 확인하면 timestamp, status 도 마찬가지로 mapping 할 필요가 있었으므로 설정.

    이것은 terraform 에서는 설정할 수 없었으므로 수동으로 설정.





    Datadog Logs 알림 설정



    이것은 terraform에서 설정할 수 있었다.
    # NOTE: You can check the query is configured on the view page such as https://app.datadoghq.com/monitors/<monitor_id>
    # But, it is not shown on the edit page such as https://app.datadoghq.com/monitors#<monitor_id>/edit.
    # It looks the field of edit page is `queryString` rather than `query`, but terraform does not support to configure it.
    resource "datadog_monitor" "warning_k8s_pod_logging" {
      name    = "(${var.env}) WARNING K8s Pod Logging"
      type    = "log alert"
      message = "Too many warnings from k8s pod logs. Notify: @slack-dev_test_notice"
      query   = "logs(\"source:gcp.k8s.pod project_id:${var.gcp_project_id} status:warn\").index(\"main\").rollup(\"count\").last(\"5m\") > 10" # Minimum is 5m (min)
    
      thresholds {
        critical = 10.0
      }
    
      notify_no_data    = false
      no_data_timeframe = 2
      new_host_delay    = 300
      renotify_interval = 0
      timeout_h         = 0
      include_tags      = true
      notify_audit      = false
      tags              = ["env:${var.env}", "project_id:${var.gcp_project_id}"]
    
      enable_logs_sample = true # Include a sample of 10 logs in the alert notification
    }
    

    이제 Datadog Logs를 경유하여 Slack 통지할 수 있어 Slack 통지에 10행까지이지만, 로그행을 포함할 수 있게 되었다.

    다만, 이하의 점은 문제가 될 것 같았다.
  • 집계 간격이 최소 5분(stackdriver는 1min이 가능)
  • (stackdriver로 할 수있는) 시간 평균을 임계 값으로 만드는 기능이 없으며 합계 만
  • (stackdriver로 할 수있는) 연속적으로 X 번 임계 값을 초과하면 경고를 날리는 기능이 없습니다.

  • Datadog Monitor에서 편집 화면으로 날아가면 query에 아무 것도 설정되지 않은 것처럼 보입니다.

  • 결론



    그런데 수작업이 필요했지만, Slack 통지에 로그행을 포함할 수 있게 되었다.
    Stackdriver 알림이 로그 행을 포함하는 옵션을 가지고 있다면, 이런 번거로움은 필요하지 않습니다.

    좋은 웹페이지 즐겨찾기