PromQLとは

PromQL (Prometheus Query Language) とは、Prometheusで利用する、データ取得、集約のためのクエリ言語のことです。

データ型

Prometheusで扱うデータの型は以下の4つがあります。(参考: Expression language data types

Instant vector時系列データ
Range vector範囲指定された時系列データ
Scalarスカラー値
String文字列

ラベルマッチャ

Prometheusはメトリクスにラベルをつけて時系列を保存します。ラベルを指定することで、特定の時系列データを選択することができます。

例えば、~httprequeststotal~ がメトリクス名の場合、ラベルenvironmentstagingのものだけを選択したい場合、 以下のように記載します。

http_requests_total{job="prometheus"}

選択する際には、以下のオペレータを利用できます。

=一致する
!=一致しない
=~正規表現で一致
!~正規表現に一致しない

メトリクスの種類

Prometheusで扱うメトリクスは以下の4つがあります。

Guageゲージ
Counterカウンター
Histgramヒストグラム
Summaryサマリー

HistogramとSummaryの違いは、 公式ドキュメントのHISTOGRAMS AND SUMMARIES を参照してください。

実際の場面ではレイテンシの計算でHistgramやSummaryが利用されますが、次のリンクの説明が詳しいです。 レイテンシーを計算する技術の話

集約

ベクトルを集計する場合は、集計の演算子を利用できます。

例えば、Instant vectorを集約するのに、以下のような集計演算子を利用できます。

  • sum
  • min
  • max
  • avg

例えば、httpリクエストの合計を求める場合は以下のように記載します。

sum(http_requests_total)

参考: Prometheus ~ Aggregation operator

関数

時系列に対して様々な処理を行う関数が存在します。

関数は~instant vector~か~range vector~のどちらかを受け取ります。 どちらを受け取るかは、ドキュメントに型として記載されています。

例えば、要素があるか判定を行う~absent(v instant-vector)~は、instant-vectorを受け取り、 ある範囲で要素があるか判定を行う~absentovertime(v range-vector)~は、range-vectorを受け取ります。

例えば、~exp(v instant-vector)~は指数関数を計算します。

他の関数は以下の公式ドキュメントを参照してください。

参考: Prometheus ~ functions

rate / irate関数

rate関数やirate関数を利用すると、1秒間の間にカウンターのメトリクスがどれだけ増加したかを計算することができます。

rate(v range-vector) 動きが遅いカウンターの平均増加率を計算します。

irate(v range-vector) 動きが早いカウンターの瞬間増加率を平均します。極端に値が上下する場合は、rateでは観測できなくなることがあるため、こちらを利用します。

カウンターのリセット対策 カウンターは再起動でリセットしてしまうことがありますが、rateやirateを使う場合は自動的に調整されます。集計演算子を利用する場合は、rateかirateを利用して、カウンターリセットの影響を受けないようにします。

例: sum

sum(rate(http_request_total[5m]))

時系列の集約関数

集約名overtimeの形式の関数が定義されており<aggregation>overtimeの形式で時間軸で集約処理を行って~instant vector~を返却することができます。

avg_over_time(range_vector)指定した範囲の平均値
min_over_time(range-vector)指定した範囲の最小値
max_over_time(range-vector)指定した範囲の最大値
sum_over_time(range-vector)指定した範囲の合計値

参考

Prometheus公式ドキュメント

Alertmanagerとは

Alertmanagerを利用すると、Prometheusで監視しているメトリクスが一定の条件を満たしたとき、メールやSlackなどにアラートを通知することができます。

インストール

こちらのリポジトリを利用すると、Docker ComposeからPrometheusを起動可能です。 → docker-composeのインストール

以下で起動します。

$ git clone https://github.com/vegasbrianc/prometheus
$ cd prometheus
$ docker-compose up

それぞれ以下のポートで起動します。

Prometheushttp://localhost:9090/
Alertmanagerhttp://localhost:9093/

Slackの通知設定

以下を参考に、Prometheus用のAppsを作成し、Incoming Webhookを有効にして、Webhook URLを取得します。

alertmanager/config.yml~に~username, channel, apiurlを指定します。

route:
 receiver: 'slack'

receivers:
 - name: 'slack'
   slack_configs:
       - send_resolved: true
         username: '<username>'
         channel: '<channel name>'
         api_url: '<webhook url>'

Alertmanagerの設定

アラートのルールは以下のように設定を行います。

groups:
- name: <ルール名>
  rules:
  - alert: <アラート名>
    expr: <クエリ式>
    for: <条件の期間>
    severity: <深刻度>
    annotations:
      description: "アラートの説明"
      summary: "サマリー"
alertアラート名を記載
exprクエリ式を指定 (PromQLで書く)
for条件の継続時間を指定 (秒:s, 分:m, 時間:h, 日:d など)
severityアラートの深刻度を指定(critical, warningなど)
annotationsアラートの説明、サマリーなど

今回のリポジトリでは、prometheus/alert.rulesにアラートのルールが記載されています。

以下のように設定を変更すると、exprが1のためアラートが発火します。

groups:
- name: rule-example
  rules:
  - alert: alert-example
    expr: 1
    for: 1m

設定の変更が終わったら、反映を行うためにDockerコンテナの再起動を行います。

再度開いてしばらく待つと、http://localhost:9090/alerts でアラートがactiveとなり発火していることがわかります。

Image

statusは、PENDING、FIRINGのどちらかとなり、FIRINGは発火を表します。

Alertmanagerの方では発火したアラートが表示されます。

Image

SlackにもPrometheusから通知が行われます。

Image

参考

目的

GitHubのIssueは古いものが残りがちなので、古くなったIssueを自動でクローズしたい。

Stale

Staleを利用すると、放置されたissueを自動的に閉じることができます。

以下のようにgithub-actionsのbotがstaleします。(動作確認用にすぐにstaleとcloseされるようにしています)

Image

インストール手順

GitHubのリポジトリのActionsタブから、テンプレートを作成できます。

Image

画面の下の方の Automate every step in your process 以下にStaleが存在します。

Image

Set up this workflow のボタンを押すと、テンプレート作成画面に遷移します。

Image

デフォルトで60日でstale、7日でstaleされたissueがcloseされます。

オプションで各種設定を変更することが可能です。 例えば、staleまで30日、closeまで5日に変更したい場合は.github/workflows/stale.ymlに以下のように記載します。

name: Mark stale issues and pull requests

on:
  schedule:
  - cron: "30 1 * * *"

jobs:
  stale:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/stale@v3
      with:
        repo-token: ${{ secrets.GITHUB_TOKEN }}
        stale-issue-message: 'Stale issue message'
        stale-pr-message: 'Stale pull request message'
        stale-issue-label: 'no-issue-activity'
        stale-pr-label: 'no-pr-activity'
        days-before-stale: 30
        days-before-close: 5

その他の設定は、リポジトリのREADME.mdに記載されています。

はじめに

定期的に実行されるジョブを作りたいとき、Cloud Functions for Firebaseを利用することができます。 プログラムを決められた時刻に定期的に実行したい場合に役に立ちます。

利用例

  • Firestoreで1日1回のユーザーデータの集計を行う
  • 不要なデータを消去する

仕組み

内部的には、cronジョブサービスのCloud Schedulerによって、Pub/Subトピックにメッセージが送信されます。Cloud Functionはこのトピックをサブスクライブすることで関数実行のスケジューリングを行います。

インストール

Blazeプランの移行

まず、Firebaseの無料プランでは利用できないため、従量課金のBlazeプランに以降する必要があります。

ツールのインストール

$ npm install -g firebase-tools

ログイン

$ firebase login

初期化

$ firebase init functions

記述方法

regionを指定する場合は、functions.regionに対象の地域を指定します。以下は1分毎に実行する例です。

間隔の指定はcronジョブ形式App Engineのcron構文で行います。

exports.scheduledFunction = functions.region('asia-northeast1')
  .pubsub.schedule('every 1 minutes')
  .timeZone('Asia/Tokyo')
  .onRun(() => {
    console.info('hello world');
  });

デプロイ

$ firebase deploy --only functions

デプロイすると以下のようにFunctionsに定期実行ジョブが追加されます。

Image

参考

Firebase公式ドキュメント

Percona XtraDB Clusterとは

Percona社のオープンソースのデーターベースクラスタシステム。 MySQLをGalera Clusterでクラスタ化しており、全てのノードがmaster/masterの構成、すなわちマルチマスターとなり、どのノードもリードとライトが可能。

テーブル変更など、DDL実行に注意する

PXCはマルチマスターであるため、DDLの実行に注意が必要。 DDLの実行方法には、TOI (Total Order Isolation)とRSU (Rolling Schema Upgrade) がある。

TOIでは、全ノードでDDLが同時に実行されるが、DDLが完了するまではトランザクションが待ち状態になる。テーブルが巨大な場合、ALTER TABLEをサービス稼働中に実行しないほうが良い。

RSUでは、DDL実行中のノードがクラスタから分離されDDLを実行する。復帰した後に更新差分が適用されて、クラスタに復帰する。1ノードずつ更新することでサービス停止せずにDDLを実行できるが、DDLが反映されたカラムの削除や変更などは実行できない。

サービス停止せずに、削除や変更などを行いたいとき、pt-online-schema-changeを利用することも可能。ただしサーバーの負荷が高くなる。

参考

購入したもの

FLEXISPOT EN1B

  • 定価: 33100円
  • 当時定価の10%OFFで、30000円だった

https://amzn.asia/d/eNWTOYv

電動ドライバー

  • FlexiSpotに天板を取り付ける際に必要になる。
  • あまり大きいドリルを買っても持て余しそうなので、こちらを購入。
  • 2980円

https://amzn.asia/d/3yu75sk

天板 アカシア

  • ホームセンターに行って購入した
  • サイズ: 縦65cm 横140cm (カット後)
  • 約10000円
  • カット代: 160円
  • 送料: 2000円
  • 木材: 7000円

サンドペーパー

  • 木材をやすりがけする際に必要
  • 主に600を利用した
  • 980円

https://amzn.asia/d/cjK8AGH

ワトコワックス

塗るために「ブリキの小物いれ」と「はけ」も同時に購入した

組み立て

ヤスリがけ

  • オイルを塗る前に全体をヤスリがけする
  • 表面と側面を手で触ってすべすべになるまでヤスリがけする

オイル塗り

  • ヤスリがけが終わったら、ワトコオイルを塗っていく
  • 全体に塗ったら15分程度時間をおき、余分なオイルを拭く、その後1時間程度乾かす
  • 乾いたらもう一度同じ手順で、オイル塗りを行う
  • 最後にサンドペーパーでやすりがけを行い、オイルを拭き取る
オイル塗り

オイル塗り

乾燥

乾燥

オイル後

オイル後

組み立て

  • 天板の取り付けでは、電動ドライバーを利用する
  • 一人だと大変なので、できるだけ二人以上で組み立てた方が良い

完成

椅子に座るとき

スタンディングのとき

26件中 21 - 26件を表示