GitHub GraphQL APIでApproveとCheckのステータスを取得する

クエリ

{
  search(type: ISSUE, last: 100, query: "is:open is:pr author:@me org:qubole") {
    nodes {
      ... on PullRequest {
        title
        url
        reviewDecision
        commits(last: 1) {
          nodes {
            commit {
              statusCheckRollup {
                state
              }
            }
          }
        }
      }
    }
  }
}

結果

{
  "data": {
    "search": {
      "nodes": [
        {
          "title": "Fix or skip deepsource check in commands.py",
          "url": "https://github.com/qubole/qds-sdk-py/pull/341",
          "reviewDecision": "REVIEW_REQUIRED",
          "commits": {
            "nodes": [
              {
                "commit": {
                  "statusCheckRollup": {
                    "state": "SUCCESS"
                  }
                }
              }
            ]
          }
        }
      ]
    }
  }
}

cf.

SwiftのCLIでGitHub APIをたたく

GitHub - winebarrel/swift-octokit-cli-example

// let package = Package(
//     name: "octokit-cli",
//     platforms: [
//         .macOS(.v14),
//     ],

import Foundation
import OctoKit

let env = ProcessInfo.processInfo.environment
let token = env["GITHUB_TOKEN"]!
let config = TokenConfiguration(token)

let octokit = Octokit(config)
let user = try! await octokit.me()
print(user.name!)

// async未対応の場合
let ns = try! await withCheckedThrowingContinuation { continuation in
    octokit.myNotifications { response in
        switch response {
        case let .success(notifications):
            continuation.resume(returning: notifications)
        case let .failure(error):
            continuation.resume(throwing: error)
        }
    }
}

for n in ns {
    print(n.subject.title!)
}

Datadogのアラートの通知メッセージに入れているもの

SRE Advent Calendar 2023の10日目の記事です。


業務でDatadogを使っていてモニターは以下のような感じでterraformで管理しているんですが、通知メッセージに入れているものをつらつら書いてみます。

resource "datadog_monitor" "elb_http_5xx" {
  name = "Too many ELB HTTP 5XX on {{name.name}}"
  type = "metric alert"

  message = <<-EOT
    @slack-hogehoge
    @pd-hogehoge
    @hoge@example.com
    (このへんに書いているものをつらつらと)
  EOT

  query = "sum(last_5m):avg:aws.applicationelb.httpcode_elb_5xx{service:my-service} by {name,service}.as_count() > 200"

  monitor_thresholds {
    warning  = 100
  }
}

Runbook

esaのRunbookへのリンクです。ヒューマンリーダブルなURLで開けるやつを作ったのでそれ経由でesaのRunbookを開くようにしてます。

ログ

SFnのイベント経由で通知されるバッチのエラーなどにDatadog Logsのリンクを入れています。アラート通知ですぐにログを見れるのでなかなか便利です。

※Datadogのカスタムサブドメインでsub-org(サービス)ごとにドメイン分けてます。

SFnのExecution

SFn側でエラー時にリンクを組み立てて、バッチのエラー時にメッセージに失敗したExecutionへのリンクを含めるようにしてます。

※アカウントを固定できるpersistent linkが欲しいところですが…

APM

WebアプリのステータスコードのモニターとかににバックエンドのアプリのAPMへのリンクを書いてます。 あと、WebアプリだけではなくJob WorkerにもAPMを仕込んでいたりするので、workerのジョブエラーのモニターでもAPMへのリンクを書いていたりします。

APM・ログ・エラートラッキングはDatadog上で関連付けるようにしているので、APMのリンクを開くとそこからログ・エラートラッキングも開けて便利です。

Slackチャンネル

通知先のSlackのチャンネルを開くためのリンクです。メールで通知を受け取った場合に、通知メッセージからSlackチャンネルを開けます。エラーが起きた場合に通知先チャンネルで会話が進んでいることが多いので、メールで気づいた場合には便利です。

Error Tracking/Trace

エラートラッキングのモニターではIssue IDなどがとれるので、そこからエラートラッキング情報・トレースへのリンクを作成できます。

Stack Trace

これもエラートラッキングのモニターですが、{{span.attributes.error.details}}のような感じでスタックトレースがとれる(場合もある)ので、それをメッセージに埋め込んでます。 ただし、たまに長すぎて切れます。

curlで叩けるURL

外形監視のモニターにすぐに手元で動作確認ができるよう、curlで叩けるヘルスチェック先のURLを入れてます。

その他Tipsなど

  • Datadogのリンクは一見長いんですが、?query=service:my-service+env:stgのようにURLエンコードしない文字を使ったり、余計なパラメータをカットしたりすれば結構短くできます
  • last_triggered_at_epochなどを使うと、アラート発生時刻に合わせたリンクにできます
  • モニターがリカバリしたのSlack通知がノイズになる場合、リカバリの時は通知しないようにしてます
{{#is_alert}}
@slack-hoge
{{/is_alert}}