Mail Latencyアクション
mail-latencyアクションはMaildir形式のディレクトリからメールを読み、Receivedヘッダーから配送にかかった時間を求めてCSVファイルに書き出します。
外部アクションとしてmozership/probe-mail-latency で公開しています。Probe v1.21.0までは組み込みアクションでした。ワークフローが初めて使うときにProbeがダウンロードし、固定したコミットのaction.ymlが示すSHA-256と一致する実行ファイルだけを実行します。Probe v1.21.0以降が必要です。各リリース のノートの先頭に、コピーして使うusesの行があります。
このアクションはどのホストにも接続しないため、action.ymlでguard: [allow-host]を申告しています。そのため、--allow-hostの下でも--allow-actionなしで実行します。output_dirにCSVを書くためread-onlyは申告しておらず、--read-onlyの下では、--allow-actionで指定しない限りこのアクションを使うステップを拒否します。ガードを参照してください。
基本的な構文
このアクションはディレクトリ内のメールを読み、計測結果をCSVとして書き出します。
steps:
- name: Measure delivery latency
uses: github.com/mozership/probe-mail-latency@2340503ddb7081e1a7e4cc7e4391ac6e5937574d # v0.1.0
with:
mail_dir: "/var/mail/probe/new"
output_dir: "./reports"
test: res.status == 0パラメータ
読み込み元と書き出し先の2つのディレクトリが必要です。
| パラメータ | 型 | 必須 | 説明 |
|---|---|---|---|
mail_dir | String | 必須 | 計測対象のメールが置かれたディレクトリ |
output_dir | String | 必須 | CSVを書き出すディレクトリ |
mail_dirはサブディレクトリも含めて再帰的に読みます。計測するのは、配送されたメールの多くがそうであるように、Return-Path:かDelivered-To:のヘッダーで始まるファイルです。それ以外のファイルは無視します。読むのは最初の空行までのヘッダーだけで、ヘッダーは複数行に折り返されていてもいなくても構いません。計測するメールにDateヘッダーかReceivedヘッダーがないと、アクションは失敗し、CSVを書き出しません。
CSVにはメール1通につき1行を書き出します。列は以下のとおりです。
Sent Time Offset (sec)とReceived Time Offset (sec): ディレクトリ内で最も早いDateを起点とした、送信と受信の時刻Sent Time:Dateヘッダーの時刻Last Received TimeとFirst Received Time: 一番上と一番下のReceivedヘッダーの時刻End-to-End Latency (sec):Dateから一番上のReceivedまでの時間Relay Latency (sec): 一番下のReceivedから一番上のReceivedまでの時間Return PathとFile Path: エンベロープの送信者とファイル名
時刻は、probeを実行しているマシンのローカルタイムゾーンで2006-01-02 15:04:05の形式で書き出します。
レスポンスオブジェクト
結果には、書き出したファイルの場所が入ります。
| プロパティ | 型 | 説明 |
|---|---|---|
res.output_file | String | 書き出したCSVのパス。ファイル名はmail-latency.<timestamp>.csv。前の実行と同じ秒に実行した場合は、上書きせずにmail-latency.<timestamp>-2.csvのように番号を付ける |
res.status | Integer | 成功時は0 |
rt.duration | String | 計測に要した時間(例: "1.2ms") |
rt.sec | Float | 計測に要した時間(秒) |
status | Integer | 成功時は0 |
使用例
SMTPで送ったメールが届くのを待ってから計測する例です。
jobs:
- name: Mail delivery latency
steps:
- name: Send a probe mail
uses: smtp
with:
addr: "{{vars.smtp_addr}}"
from: "probe@example.com"
to: "probe@example.com"
subject: "probe {{vars.run_id}}"
session: 1
message: 1
length: 500
test: res.code == 0 && res.sent > 0
- name: Measure
id: latency
uses: github.com/mozership/probe-mail-latency@2340503ddb7081e1a7e4cc7e4391ac6e5937574d # v0.1.0
wait: 30s
with:
mail_dir: "{{vars.maildir}}/new"
output_dir: "./reports"
test: res.status == 0
outputs:
report: res.output_file
- name: Report
uses: hello
echo: "CSV: {{outputs.latency.report}}"