ようへいの日々精進XP

よかろうもん

2021 年 12 月 13 日 (月)

アクティビティ (今までの走行 (歩行) 距離)

https://pixe.la/v1/users/inokappa/graphs/fitbit-activity

Fitibit Charge2 のアクティビティから走行 (歩行) 距離を Fitbit Web API で取得して Pixela で草生やしている。色が濃くなれば濃くなる程強度が高い (歩行、走行距離が長い) ということで。実装の詳細はこちら

ジョギング

strava メンテナンス中なので、リンクが貼れないけど、エアロバイクを 1 時間。右臀部に強い張りがある。

レアジョブ

今日はお休み。明日は、朝の 7 時から正蔵先生。

夕飯

美味しゅうございました。

2021 年 12 月 12 日 (日)

アクティビティ (今までの走行 (歩行) 距離)

https://pixe.la/v1/users/inokappa/graphs/fitbit-activity

Fitibit Charge2 のアクティビティから走行 (歩行) 距離を Fitbit Web API で取得して Pixela で草生やしている。色が濃くなれば濃くなる程強度が高い (歩行、走行距離が長い) ということで。実装の詳細はこちら

ジョギング

久しぶりに大濠公園まで行ってきた。

レアジョブ

今日も正蔵先生で雑談が捗った。

夕飯

今日もお鍋。

ランチというかおやつに

徳川苑という焼肉屋さんでユッケジャンラーメンを食べた。

tokugawaen-yakiniku.com

2021 年 12 月 11 日 (土)

アクティビティ (今までの走行 (歩行) 距離)

https://pixe.la/v1/users/inokappa/graphs/fitbit-activity

Fitibit Charge2 のアクティビティから走行 (歩行) 距離を Fitbit Web API で取得して Pixela で草生やしている。色が濃くなれば濃くなる程強度が高い (歩行、走行距離が長い) ということで。実装の詳細はこちら

ジョギング

レアジョブ

久しぶりの正蔵先生。正蔵先生はとても雑談が捗るので良い。

夕飯

お鍋を実装。美味しゅうございました。

終日

バタバタで疲れた〜

2021 年 12 月 10 日 (金)

アクティビティ (今までの走行 (歩行) 距離)

https://pixe.la/v1/users/inokappa/graphs/fitbit-activity

Fitibit Charge2 のアクティビティから走行 (歩行) 距離を Fitbit Web API で取得して Pixela で草生やしている。色が濃くなれば濃くなる程強度が高い (歩行、走行距離が長い) ということで。実装の詳細はこちら

ジョギング

レアジョブ

久しぶりに val 先生だった。val 先生、元気そうだった。明日は、正蔵先生。

夕飯

CircleCI でワークフロージョブの処理時間を可視化する試み

これは

YAMAP エンジニア Advent Calendar 2021 の第 11 日目と、CircleCI Advent Calendar 2021 の第 11 日目の記事になる予定です。

qiita.com

qiita.com

経緯

YAMAP では、CircleCI を使って CI/CD を回していますが、既存機能の改善や、新機能のリリースに伴って、テストやデプロイの時間が長くなってきており、継続的に処理時間の改善を模索しています。

改善にあたって、処理時間の計測方法について試行錯誤してきましたが、最近、CircleCI Insights のダッシュボードを確認したところ、ブランチを横断して、ワークフロージョブの処理時間の可視化することが出来るようになっていました。

circleci.com

今回は、このワークフロージョブの処理時間の可視化について、これまで YAMAP でやっていたことも含めて書いてみようと思います。

特定のワークフロージョブの処理を可視化する試み v1 (自前のシェルスクリプトでやっていた)

.circleci/config.yml

以下のように、.circleci/config.yml 内で BashSECONDS 変数を用いて、愚直に処理時間を取得するように仕込んだ上で、シェルスクリプト内で API (下記の例では、duration.sh) を叩いて、AWS の CloudWatch や Datadog にメトリクスを放り込んでいました。

version: 2.1
orbs:
  aws-cli: circleci/aws-cli@x.x.x
...
executors:
...
commands:
...
  build:
    executor:
      name: default
    steps:
      - run:
          name: Run Build
          command: |
            SECONDS=0
... 実際の処理 ...
            duration_seconds=$SECONDS
            bin/duration.sh dev build ${duration_seconds} ${CIRCLE_BRANCH}
workflows:
  build:
    jobs:
      - build:
          filters:
            branches:
              ignore:
                - master
                - develop

ちなみに、build.sh の中身は、以下のような感じ。

#!/bin/bash

environment=${1}
workflow=${2}
value=${3}
branch=${4}
now="$(date +%s)"

function put_to_aws {
  aws cloudwatch \
    put-metric-data \
      --metric-name Duration \
      --namespace "Custom/CircleCI/${workflow}" \
      --value ${value} \
      --dimensions Name=environment,Value=${environment} \
      --timestamp=${now}
}

function put_to_datadog {
  curl -X POST "https://api.datadoghq.com/api/v1/series?api_key=${DD_CLIENT_API_KEY}" \
  -H "Content-Type: application/json" \
  -d @- << EOF
  {
    "series": [
      {
        "metric": "circleci.${workflow}",
        "points": [
          [
            "${now}",
            "${value}"
          ]
        ],
        "tags": [
          "${environment}",
          "branch:${branch}"
        ]
      }
    ]
  }
EOF
}

put_to_aws &
put_to_datadog &

wait

CloudWatch メトリクスと Datadog の両方に経過時間を飛ばしている様子です。

SECONDS 変数を使った処理時間の計測

上記の例では、BashSECONDS 変数を使って、処理時間を計測しています。この変数は、シェルが起動されてからの秒数が格納されます。

$ cat test.sh
#!/bin/bash

SECONDS=0
sleep 3
duration_seconds=$SECONDS

echo $duration_seconds
$ ./test.sh
3

Datadog で可視化

そして、実際に Datadog で可視化したものは、下図の通りです。

f:id:inokara:20211209234333p:plain

ただし

今更気付きましたが、上記のアプローチだと、厳密なワークフロージョブの処理時間を計測出来ていません。ジョブの中の特定のステップの処理時間を計測しているだけになります。もう少し、ちゃんとやろうとすると、以下のように書くと良さそうです。

---
version: 2.1

orbs:
  aws-cli: circleci/aws-cli@1.3.1

jobs:
  build:
    docker:
      - image: cimg/base:2020.01
    steps:
      - run:
          name: Job Start!!
          command: |
            echo "export START_TIME=$(date +%s)" >> $BASH_ENV
      - run:
          name: Sleep 5
          command: |
            sleep 5
      - aws-cli/install
... 省略 ...
      - run:
          name: Job Stop!!
          command: |
            END_TIME=$(date +%s)
            DURATION_SECONDS=$((${END_TIME}-${START_TIME}))
            echo "START_TIME=${START_TIME}"
            echo "END_TIME=${END_TIME}"
            echo "DURATION_TIME=${DURATION_SECONDS}"
            bin/duration.sh dev build ${DURATION_SECONDS} ${CIRCLE_BRANCH}

特定のワークフロージョブの処理を可視化する試み v2 (CircleCI Insights)

お手軽 CircleCI Insights

左のメニューバーに Insights 機能が鎮座しています。トップメニューの中に名を連ねているあたり、お手軽に利用して欲しいという CircleCI のお気持ちを感じます。

f:id:inokara:20211209234355p:plain

これをクリックすると、以下のように表示されます。

f:id:inokara:20211209234411p:plain

プロジェクトをクリックすると、以下のように表示されます。

f:id:inokara:20211209234427p:plain

そして、All Workflows プルダウンから、確認したい Workflow の名前をクリックすると、以下のように表示されます。

f:id:inokara:20211209234441p:plain

Y 軸が時間を示していて、全てのブランチのワークフロージョブ処理時間の推移を確認することが出来る棒グラフが表示されました。

まさに、これが欲しかった

以下のように、各ワークフロージョブの処理時間や、何のくらいのクレジットを消費しているかも表示されます。また、成功と失敗のについてもグリーンとレッドで表示されており一目瞭然です。

f:id:inokara:20211209234500p:plain

ただし

上記のグラフは、最新の 100 件の処理時間の結果しか表示されないので、継続的に処理時間の推移をモニタリングしたい場合には、冒頭に書いたように愚直に処理時間を計測する必要があると思います。(API で取得出来るかもしれませんが、まだ、試せていません)

後述の、Datadog の CircleCI Integration を利用することで、継続的に処理時間の推移をお手軽にモニタリングすることが可能です。

とは言え、こんな機能を提供してくださって Circle CI さん、有難うございます。

特定のワークフロージョブの処理を可視化する試み v3 (そう言えば、Datadog でも)

CircleCI Integration

ここまで書いておいて、Datadog に CircleCI Integration を利用することで、ワークフロージョブの時間を可視化することが出来ることを思い出しました。

f:id:inokara:20211210165841p:plain

こんな風に仕込んで

f:id:inokara:20211210170852p:plain

結果を待ちたいと思います。

いい感じじゃないですか!

とてもいい感じで可視化されました。

f:id:inokara:20211210175434p:plain

Datadog のクエリを駆使して、ワークフロージョブ毎の処理時間や、プロジェクト単位等を良い感じで可視化出来ています。

ということで

処理時間の改善は一日して成らず。継続的な観測が必要となります。

2021 年 12 月 09 日 (木)

アクティビティ (今までの走行 (歩行) 距離)

https://pixe.la/v1/users/inokappa/graphs/fitbit-activity

Fitibit Charge2 のアクティビティから走行 (歩行) 距離を Fitbit Web API で取得して Pixela で草生やしている。色が濃くなれば濃くなる程強度が高い (歩行、走行距離が長い) ということで。実装の詳細はこちら

ジョギング

レアジョブ

昨日と同じ先生でやってみた。今日もテンポが早くて付いていくのがやっとだった。明日も 19 時から同じ先生で予約を入れた。

夕飯

俺たちの SUNNY で入手可能な国産の鮭。これが、焼き方の上手さも相まって、とても美味しい。これでご飯が何杯でもイケる。美味しゅうございました。

JAWS-UG 福岡 #53

に参加。

jaws-ug-kyushu.doorkeeper.jp

ゆるーくやっている感じがとても良い。

2021 年 12 月 08 日 (水)

アクティビティ (今までの走行 (歩行) 距離)

https://pixe.la/v1/users/inokappa/graphs/fitbit-activity

Fitibit Charge2 のアクティビティから走行 (歩行) 距離を Fitbit Web API で取得して Pixela で草生やしている。色が濃くなれば濃くなる程強度が高い (歩行、走行距離が長い) ということで。実装の詳細はこちら

ジョギング

レアジョブ

今日も新しい先生でやってみた。テンポが早くて付いていくのがやっとだったけど、文法の誤りの指摘をつどつどやって貰えたのが良かった。明日も同じ時間で予約を入れた。

夕飯

おごちそうさまでした。

2021 年 12 月 07 日 (火)

アクティビティ (今までの走行 (歩行) 距離)

https://pixe.la/v1/users/inokappa/graphs/fitbit-activity

Fitibit Charge2 のアクティビティから走行 (歩行) 距離を Fitbit Web API で取得して Pixela で草生やしている。色が濃くなれば濃くなる程強度が高い (歩行、走行距離が長い) ということで。実装の詳細はこちら

ジョギング

朝はジョッグ、夕方は 60 分のエアロバイク。朝のジョッグは、久しぶりに「どこか痛い」ということが全くなくて、むしろ変な感じだった。ただ、両足のふくらはぎが終始痛かったのが気になるのと、夕方になって、右の臀部に痛みが出てきたのも気になる。

レアジョブ

久しぶりのレアジョブ。新しい先生でやってみたけど、何とか乗り切ることが出来た。どういうわけか、最近は、お気に入りの先生の予約が取れない。これはマズイ。

夕飯

全て美味しゅうございました。

2021 年 12 月 06 日 (月)

アクティビティ (今までの走行 (歩行) 距離)

https://pixe.la/v1/users/inokappa/graphs/fitbit-activity

Fitibit Charge2 のアクティビティから走行 (歩行) 距離を Fitbit Web API で取得して Pixela で草生やしている。色が濃くなれば濃くなる程強度が高い (歩行、走行距離が長い) ということで。実装の詳細はこちら

ジョギング

朝、エアロバイクを一時間。

夕方は走ろうと思ったけど、バタバタしていて走ることもエアロバイクを漕ぐことが出来なかった。

レアジョブ

さすがに一週間も休むのはヤバいので、明日、新しい先生で予約を入れてみた。お気に入りの先生は、なかなか予約を取れず...

夕飯

奥さん特製のおろしハンバーグ。美味しゅうございました。

疲れたー

今日は、午前中からお昼過ぎにかけて、慣れないこと (面談や議事録作成) やったので、午後はヘトヘトだった(汗 おまけに、夕方からは、頭痛もしたりして、やりたい作業を思ったように進めることが出来なかった。たまには面談やら議事録作成等はやるべきだなーって反省。

さよならと残念

ギョームで長年お世話になっていた Elasticsearch + Kibana 環境を撤去した。ありがとうございました。そして、プライベートでも、とても残念なことが一件。人生って色々とありますなあ。

2021 年 12 月 05 日 (日)

アクティビティ (今までの走行 (歩行) 距離)

https://pixe.la/v1/users/inokappa/graphs/fitbit-activity

Fitibit Charge2 のアクティビティから走行 (歩行) 距離を Fitbit Web API で取得して Pixela で草生やしている。色が濃くなれば濃くなる程強度が高い (歩行、走行距離が長い) ということで。実装の詳細はこちら

ジョギング

エアロバイクをダブルヘッダー

レアジョブ

更に今日もお休み。やる気が無くなってきた。

夕飯

今夜も鍋。