我尝试创建了一个SORACOM的成本仪表板

这篇是SORACOM Advent Calendar 2020的第15篇文章。

简而言之

    • SORACOM APIを叩いてコスト詳細をGrafanaで見えるようにした

 

    • ユーザコンソールの「ご利用料金詳細」の「CSV形式でダウンロード」からexcelでピボットテーブルを都度作るの飽きたので

 

    料金明細csvをGrafanaでみえるようにしただけではある
grafana.png

想做的事情 zuò de shì

    • simごとbill item(s1.fastとかbeamとか基本使用料とか)の内訳を見たい

 

    ダッシュボードで時系列としてぱぱっと見たい

实施

再次看到这个人在SORACOM API上请求并传输给node_exporter的text collector…就会想起去年的事,不能不回忆一下。

系统配置

system.png
./
    prometheus/
        (prometheus本体とかconfとか)
    node_exporter/
        node_exporter(bin本体)
        text_collector/
            soracom_cost.prom
    soracom_cost_exporter/
        main.py(作ったbatch) 
    • batch

crondとかでhourlyで起動
SORACOM APIのPOST /bills/latest/exportを叩く
csvを集計してprometheus metricsをtextで出力
ユーザコンソール上でsimごとtagを指定してるとさらにcsvには追加されたりするのでよしなに調整を

それをnode exporterのtext collectorで読み取ってあとはprometheusやgrafanaへ

prometheus側はnode exporterをscrapeする設定いれてるだけ
node_exporterは起動オプションでtext collectorを有効に

批处理代码

import io
import json

import pandas as pd
import requests
from prometheus_client import CollectorRegistry, Gauge, write_to_textfile

# get cost csv
auth_response = requests.post(  # get soracom access token
    url="https://api.soracom.io/v1/auth",
    headers={"Content-Type": "application/json"},
    data=json.dumps(
        {
            "authKeyId": "keyId-(自分の)",
            "authKey": "secret-(自分の)"
        }
    )
)
export_response = requests.post(  # get latest bill report url
    url="https://api.soracom.io/v1/bills/latest/export?export_mode=sync",
    headers={
        "X-Soracom-API-Key": auth_response.json().get("apiKey"),
        "X-Soracom-Token": auth_response.json().get("token"),
        "Accept": "application/json",
    }
)
cost_csv_url = export_response.json().get("url")  # download cost csv
cost_csv_response = requests.get(cost_csv_url)

# tally a cost csv
df = pd.read_csv(io.BytesIO(cost_csv_response.content))
df = pd.pivot_table(
    df,
    values="amount",
    index=["name", "billItemName", "group:name"],
    columns=[],
    aggfunc="sum"
)

# write metrics file
registry = CollectorRegistry()
soracom_cost_gauge = Gauge(
    "soracom_cost_jpy",
    "soracom cost jpy",
    ["name", "bill_item", "group_name"],
    registry=registry
)
for d in df.itertuples(name=None):
    name, bill_item_name, group_name = d[0]
    amount = d[1]
    soracom_cost_gauge.labels(name, bill_item_name, group_name).set(amount)
write_to_textfile("../node_exporter/text_collector/soracom_cost.prom", registry)

设计指标

    • name/bill_item/group_nameごとに料金明細csvのamountを割当

 

    • monthlyのcostがずっと増えていって月初でresetされる感じ

 

    出力されるファイルの中身はこんな
$ cat node_exporter/text_collector/soracom_cost.prom
# HELP soracom_cost_jpy soracom cost jpy
# TYPE soracom_cost_jpy gauge
soracom_cost_jpy{bill_item="basicCharge-active",group_name="default",name="docomo"} 140.0
soracom_cost_jpy{bill_item="soracomHarvestCharge",group_name="default",name="docomo"} 70.0
soracom_cost_jpy{bill_item="basicCharge-active",group_name="default",name="kddi"} 140.0
soracom_cost_jpy{bill_item="soracomHarvestCharge",group_name="default",name="kddi"} 70.0
soracom_cost_jpy{bill_item="downloadDataCharge-s1.fast-daytime",group_name="default",name="kddi"} 150.0

Grafana的设置

仪表盘内部

image.png
image.png

关于可以获得的度量标准的辩解

    • docomoとかkddiとかがsimのtag:Nameです(分かりづらいですが…)

 

    • データの更新頻度などは嘘っぱちです

表にだせるそれっぽい利用料金のデータがなかったので個人のを加工してます
データが蓄積されてなくて(直前で記事書いてるからゲフンゲフン…)

试试看

    • 結構がっつりSORACOMさんを使っているのでcostを真面目にみないとなと

 

    • んでAWS web consoleでいうとこのcost expolorerが欲しかった

 

    • が、SORACOMユーザコンソールだと通信量などのダッシュボードはあれどコストの画面はシンプル…

 

    • SORACOM Harvest Dataに料金データを突っ込んでLagoonでみるか?とも思ったが、流石に用途違いな感じで…

 

    • やっぱGrafanaでぐりぐりいじれるとexcelのピボットテーブルとにらめっこには戻れないw 気軽に見えるようにするのが肝要

 

    きっとこんなの自作しなくとも、おいおいソラコムさんがかっこいいダッシュボードを実装してくれるはず!(チラッ

结束

bannerAds