0
0

More than 1 year has passed since last update.

Sysdig Monitoring API (python)

Last updated at Posted at 2023-08-29

IBM Cloud Monitoring with Sysdigサービスは、管理者、DevOpsチーム、開発者向けの、フル管理のエンタープライズ・グレードのモニタリング・サービスです。コンテナの深い可視性、サービス指向のビュー、包括的なメトリックが得られます。

Sysdig UI の Dashboard や Panel を利用して Metric 情報を確認することが一般的ですが、Monitoring API を使用することで、JSON Format で Metric Data を取得することが可能です。
Panel の Export 機能でも Metric Data を取得することができますが、Monitoring API は、より詳細な設定が可能です。

Monitoring API は、curl または python で利用することができます。

Extracting metrics from a Monitoring instance by using the Monitoring API
https://cloud.ibm.com/docs/monitoring?topic=monitoring-metrics_api
Extracting metrics from an instance by using the Monitoring Python client
https://cloud.ibm.com/docs/monitoring?topic=monitoring-metrics_python

ここでは、python による Sysdig Monitoring API の利用方法をご紹介します。
curl については、以下をご覧下さい。
Sysdig Monitoring API (curl)
https://qiita.com/qiita2021user/items/4568cd9f8210e62ac3f1

Install required modules

以下の手順に従って、必要な Module を導入します。
Using the Python client
https://cloud.ibm.com/docs/monitoring?topic=monitoring-python-client

Code Basic

基本的な python code は以下の通りです。

# Reference the Python client
from sdcclient import IbmAuthHelper, SdMonitorClient

# Add the monitoring instance information that is required for authentication
URL = <MONITORING-ENDPOINT>
APIKEY = <IAM_APIKEY>
GUID = <GUID>
ibm_headers = IbmAuthHelper.get_headers(URL, APIKEY, GUID)

# Instantiate the Python client
sdclient = SdMonitorClient(sdc_url=URL, custom_headers=ibm_headers)

# Specify the ID for keys, and ID with aggregation for values
metrics = [
    {"id": "cpu.used.percent", "aggregations": {"time": "timeAvg", "group": "avg"}}
]

# Add a data filter or set to None if you want to see "everything"
filter = None

# Time window:
#   - for "from A to B": start is equal to A, end is equal to B (expressed in seconds)
#   - for "last X seconds": start is equal to -X, end is equal to 0
start = -600
end = 0

# Sampling time:
#   - for time series: sampling is equal to the "width" of each data point (expressed in seconds)
#   - for aggregated data (similar to bar charts, pie charts, tables, etc.): sampling is equal to 0
sampling = 60

# Load data
ok, res = sdclient.get_data(metrics, start, end, sampling, filter=filter)
if ok:
    print(res)

IbmAuthHelper, SdMonitorClient

IbmAuthHelper, SdMonitorClient の Help は以下の通りです。

>>> from sdcclient import IbmAuthHelper, SdMonitorClient

>>> help(IbmAuthHelper)
Help on class IbmAuthHelper in module sdcclient.ibm_auth_helper:

class IbmAuthHelper(builtins.object)
 |  Authenticate with IBM Cloud IAM.
 |
 |  **Arguments**
 |      **url**: Sysdig endpoint URL that should point to IBM Cloud
 |      **apikey**: IBM Cloud IAM apikey that will be used to retrieve an access token
 |      **guid**: GUID of an IBM Cloud Monitoring with Sysdig instance
 |
 |  **Returns**
 |      A dictionary that will authenticate you with the IBM Cloud IAM API.
 |
 |  Static methods defined here:
 |
 |  get_headers(url, apikey, guid)
 |
 |  ----------------------------------------------------------------------
 |  Data descriptors defined here:
 |
 |  __dict__
 |      dictionary for instance variables (if defined)
 |
 |  __weakref__
 |      list of weak references to the object (if defined)

>>> help(SdMonitorClient)
Help on class SdMonitorClient in module sdcclient._monitor:

class SdMonitorClient(sdcclient.monitor._dashboards_v3.DashboardsClientV3, sdcclient.monitor._events_v2.EventsClientV2, sdcclient._common._SdcCommon)
 |  SdMonitorClient(token='', sdc_url='https://app.sysdigcloud.com', ssl_verify=True, custom_headers=None)
 |
 |  Method resolution order:
 |      SdMonitorClient
 |      sdcclient.monitor._dashboards_v3.DashboardsClientV3
 |      sdcclient.monitor._events_v2.EventsClientV2
 |      sdcclient._common._SdcCommon
 |      builtins.object
 |
省略

URL

Sysdig の Endpoint を指定します。Endpoint は以下から確認できます。
Endpoints
https://cloud.ibm.com/docs/monitoring?topic=monitoring-endpoints#endpoints_monitoring

ここでは、以下の Endpoint を使用します。

URL = "https://jp-tok.monitoring.cloud.ibm.com"

APIKEY

Sysdig Instance へのアクセスに必要な API Key を指定します。
Authenticate your user or service ID by using IAM
https://cloud.ibm.com/docs/monitoring?topic=monitoring-python-client#python-client-iam-auth

APIKEY = "<API Key>"
参考

以下のようなエラーが発生する場合は、API Key が正しくない可能性があります。

Traceback (most recent call last):
  File "./sample.py", line 14, in <module>
    ibm_headers = IbmAuthHelper.get_headers(URL, APIKEY, GUID)
  File "/usr/local/lib/python3.9/site-packages/sdcclient/ibm_auth_helper.py", line 18, in get_headers
    iam_token = IbmAuthHelper.__get_iam_token(url, apikey)
  File "/usr/local/lib/python3.9/site-packages/sdcclient/ibm_auth_helper.py", line 51, in __get_iam_token
    response.raise_for_status()
  File "/root/.local/lib/python3.9/site-packages/requests/models.py", line 1021, in raise_for_status
    raise HTTPError(http_error_msg, response=self)
requests.exceptions.HTTPError: 400 Client Error: Bad Request for url: https://iam.cloud.ibm.com/identity/token

Note: If you get the error 400 Client Error: Bad Request for url: https://iam.cloud.ibm.com/identity/token, check the API key. The value that you are passing is not valid.

GUID

Sysdig Instance の GUID を指定します。GUID は以下から確認できます。

$ ibmcloud monitoring service-instances --all-resource-groups
Listing service instances for jp-tok region and for all resource groups...
OK
Name           Region   State    Service Name     Platform Metrics
my-sysdig-01   jp-tok   active   sysdig-monitor   Enabled

$ ibmcloud resource service-instance my-sysdig-01 --output json | jq -r '.[].guid'
****-****-****-****-****
GUID = "****-****-****-****-****"

Sample Code

上記の情報に加えて、いくつかの修正を行った Sample Code です。

$ cat sample.py
#!/usr/bin/env python3.9

from sdcclient import IbmAuthHelper, SdMonitorClient

# Add the monitoring instance information that is required for authentication
# URL = <MONITORING-ENDPOINT>
URL = "https://jp-tok.monitoring.cloud.ibm.com"

# APIKEY = <IAM_APIKEY>
APIKEY = "****-****-****-****"

# GUID = <GUID>
GUID = "****-****-****-****-****"
ibm_headers = IbmAuthHelper.get_headers(URL, APIKEY, GUID)

# Instantiate the Python client
sdclient = SdMonitorClient(sdc_url=URL, custom_headers=ibm_headers)

# Specify the ID for keys, and ID with aggregation for values
metrics = [
    {"id": "cpu.used.percent", "aggregations": {"time": "timeAvg", "group": "avg"}}
]

# Add a data filter or set to None if you want to see "everything"
filter = None

# Time window:
#   - for "from A to B": start is equal to A, end is equal to B (expressed in seconds)
#   - for "last X seconds": start is equal to -X, end is equal to 0
start = -600
end = 0

# Sampling time:
#   - for time series: sampling is equal to the "width" of each data point (expressed in seconds)
#   - for aggregated data (similar to bar charts, pie charts, tables, etc.): sampling is equal to 0
sampling = 60

# Load data
ok, res = sdclient.get_data(metrics, start, end, sampling, filter=filter)
if ok:
    import json
    print(json.dumps(res))

実行すると、以下のように Metric が取得できます。

$ python3.9 ./sample.py | jq -r .
{
  "data": [
    {
      "t": 1693278720,
      "d": [
        41.230233
      ]
    },
    {
      "t": 1693278780,
      "d": [
        41.604561
      ]
    },
    {
      "t": 1693278840,
      "d": [
        40.772554
      ]
    },
    {
      "t": 1693278900,
      "d": [
        41.400421
      ]
    },
    {
      "t": 1693278960,
      "d": [
        41.202891
      ]
    },
    {
      "t": 1693279020,
      "d": [
        40.846263
      ]
    },
    {
      "t": 1693279080,
      "d": [
        40.325589
      ]
    },
    {
      "t": 1693279140,
      "d": [
        42.116796
      ]
    },
    {
      "t": 1693279200,
      "d": [
        43.555129
      ]
    },
    {
      "t": 1693279260,
      "d": [
        42.547032
      ]
    }
  ],
  "start": 1693278660,
  "end": 1693279260
}
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0