我为SORACOM制作了一个成本仪表板


这是SORACOM 2020年出现日历第15天的文章。

TL; DR

  • 点击SORACOM API,使费用明细在Grafana中可见
  • 我已经厌倦了通过用户控制台上"使用费用明细"中的"以CSV格式下载"使用excel创建数据透视表。
  • 我只是在Grafana中显示了收费声明csv

grafana.png
(在这种情况下,您可以在上图中看到总体成本随时间而变化,而在下图中,sim的s1.fast dl(kddi)突然增加了!数据量很小……)

你想做的事

  • 我想查看每个SIM卡的帐单项细分(s1.fast,梁,基本使用费等)
  • 我想按时间顺序在仪表板上查看它

实作

(也不要打这个人的SORACOM API来喂结node_exporter的文本收集器...或不要记得去年)

系统配置

system.png

文件结构例如

1
2
3
4
5
6
7
8
9
./
    prometheus/
        (prometheus本体とかconfとか)
    node_exporter/
        node_exporter(bin本体)
        text_collector/
            soracom_cost.prom
    soracom_cost_exporter/
        main.py(作ったbatch)
  • 批量

    • 从crond开始每小时
    • 点击POST /账单/最新/导出SORACOM API
    • 汇总csv并在文本中输出prometheus度量
    • 如果您在用户控制台上为每个SIM卡指定标签,则会将其添加到CSV中,因此请进行一些调整。
  • 使用节点导出器的文本收集器读取它,然后转到prometheus或grafana

    • 普罗米修斯方面只有设置可以刮除节点导出器
    • node_exporter在启动选项中启用文本收集器

批号

soracom_cost_exporter / main.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
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)

指标设计

  • 为每个名称/ bill_item / group_name分配费用行csv
  • 感觉每月费用一直在增加,并且会在月初重新设置
  • 输出文件的内容是这样的
1
2
3
4
5
6
7
8
$ 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

  • 由于已设置仪表板的变量,因此请使用"全部"查看整个变量,并假设如果有许多

    ,则应像过滤一样使用它

    • 时髦的一点是,仪表板变量由labels_values定义并自动获取,并在图形侧像name =?" $ {name:pipe}"一样扩展,以便可以单独或全部查看。

image.png

关于我得到

的指标的借口

  • docomo和kddi是sim标签:名称(很难理解...)
  • 数据更新的频率是一个谎言

    • 我没有表格中可以显示的使用费数据,因此我正在处理个人
    • 尚未积累任何数据(因为我在???????? ...之前写过一篇文章)

试试吧

  • 我经常使用SORACOM,所以我必须认真考虑成本
  • 因此,我希望在AWS Web控制台上使用该费用检查程序
  • 但是,通过SORACOM用户控制台,可以使用仪表盘(例如,流量),但是成本屏幕很简单...
  • 我想知道是否要将收费数据放入SORACOM Harvest Data中并在泻湖中查看,但是看来它有不同的用途...
  • 毕竟,如果您不喜欢Grafana,就无法返回excel的透视表和眩光w。重要的是要使其易于查看
  • 我敢肯定Soracom会实施一个很酷的仪表板,即使您自己没有做到!

结束