ツナワタリマイライフ

日常ネタから技術ネタ、音楽ネタまで何でも書きます。

GitHub の Repository の Pull Request の数を prometheus 形式で export する OSS 作った

昨日のこれ

blog.chaspy.me

自分の発表では prometheus 形式で export したら Datadog の Kubernetes Autodiscovery で datadog-agent が勝手に取ってくれて便利だよなんて言ったんですが

docs.datadoghq.com

prometheus 形式で export するのに個別にタグつけて export できないと思ってたんですが

godoc.org

In addition to the fundamental metric types Gauge, Counter, Summary, and Histogram, a very important part of the Prometheus data model is the partitioning of samples along dimensions called labels, which results in metric vectors. The fundamental types are GaugeVec, CounterVec, SummaryVec, and HistogramVec.

できる(できる)

ということを8億年前から知っていた @yuya-takeyama に教えてもらったので書き直しました。一応前のは残して別の repository に書きました。

github.com

つぎはぎだらけでだいぶ雑な気がしますがまぁ動いているからいいのだ。

これは何

prometheus 形式で Github の指定した repository の pull request の数を author, reviewer, label をタグとしてつけて export する君です。

f:id:take_she12:20210126035051p:plain

github.com

こっちは push のアプローチで、この中で Datadog に対して metrics を投げつけるんですが、

今回作った github-pr-prometheus-exporter は Datadog 関係ないです。prometheus 形式で、 8080:/metrics で metrics を export するだけ。

で、こういう annotation 書けば datadog-agent が取ってくれるので便利。pull 型のアプローチですね。使ってる manifest そのまま晒しちゃいます。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: github-pr-prometheus-exporter
  namespace: monitor
  labels:
    name: github-pr-prometheus-exporter
    owner: sre
spec:
  replicas: 1
  selector:
    matchLabels:
      app: github-pr-prometheus-exporter
  template:
    metadata:
      labels:
        app: github-pr-prometheus-exporter
      annotations:
        ad.datadoghq.com/github-pr-prometheus-exporter.check_names: |
          ["prometheus"]
        ad.datadoghq.com/github-pr-prometheus-exporter.init_configs: |
          [{}]
        ad.datadoghq.com/github-pr-prometheus-exporter.instances: |
          [
            {
              "prometheus_url": "http://%%host%%:8080/metrics",
              "namespace": "github-pr-prometheus-exporter",
              "metrics": ["*"]
            }
          ]
    spec:
      containers:
      - image: chaspy/github-pr-prometheus-exporter:v0.1.0
        name: github-pr-prometheus-exporter
        ports:
        - name: http
          containerPort: 8080
        livenessProbe:
          initialDelaySeconds: 1
          httpGet:
            path: /metrics
            port: 8080
        resources:
          limits:
            memory: 32Mi
          requests:
            cpu: 10m
            memory: 32Mi
        env:
          - name: GITHUB_TOKEN 
            valueFrom:   
              secretKeyRef:  
                name: "github-secret" 
                key: GITHUB_TOKEN
          - name: GITHUB_REPOSITORIES  
            value: "quipper/kubernetes-clusters,quipper/server-templates,quipper/monorepo,quipper/monorepo-global,quipper/qs-terraform,quipper/aya-terraform,quipper/iam,quipper/aya-iam,quipper/dns,quipper/aya-dns"
        securityContext:
          readOnlyRootFilesystem: true
      securityContext:
        runAsNonRoot: true
        runAsUser: 1000
      imagePullSecrets:
        - name: docker-hub
      affinity:
        nodeAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            nodeSelectorTerms:
            - matchExpressions:
              - key: quipper/type
                operator: In
                values:
                - system-components

別に push 方式でも全然いいんですが、Datadog 関係の secret を持つ必要がないって点が利点ですかね。

前作と同じく環境変数 GITHUB_REPOSITORIES で対象リポジトリを指定します。

     - name: GITHUB_REPOSITORIES  
       value: "quipper/kubernetes-clusters,quipper/server-templates,quipper/monorepo,quipper/monorepo-global,quipper/qs-terraform,quipper/aya-terraform,quipper/iam,quipper/aya-iam,quipper/dns,quipper/aya-dns"

もはやこれを deployment として浮かせることすらしたくない(どっかのサーバレスな何かに image だけ指定していい感じに動いて欲しい)ぐらいには怠惰になってきた。

まぁ何はともあれ、push 形式の前作を cronjob で定期実行するよりはこっちのアプローチのほうがいいかなと思い書き直したという話でした。

次こそはこれの issue ver を作る。