コンテンツにスキップ

外部データソース


DataFlux Func や MySQL など、さまざまなデータソースを Guance に迅速に統合し、データのシームレスなクエリと可視化を実現します。

機能

  • ネイティブクエリ:グラフでデータソースのネイティブクエリ文を直接使用。追加の変換は不要です。
  • データ保護:データセキュリティとプライバシーの観点から、すべてのデータソース情報はお客様のローカル Func にのみ保存され、プラットフォームには保存されません。これにより情報の安全性が確保され、データ漏洩を防止します。
  • カスタム管理:実際のニーズに応じて、さまざまな外部データソースを簡単に追加・管理できます。
  • リアルタイムデータ:外部データソースに直接接続し、リアルタイムでデータを取得。即座に応答し、意思決定を行えます。

2 つの統合方法

Guance 側でデータソースを追加する

拡張機能 から直接、接続済みの DataFlux Func を追加または確認し、さらにすべての接続済み外部データソースを管理します。

注意

この方法は、2 つ目の方法 よりも初心者に優しいため、推奨します。

  1. プルダウンで DataFlux Func を選択します。
  2. サポートされているデータソースの種類を選択します。
  3. 接続プロパティ(ID、データソースのタイトル、関連付けるホスト、ポート、データベース、ユーザー、パスワード)を定義します。
  4. 必要に応じて接続をテストします。
  5. 保存します。

Func を使用して外部データソースをクエリする

注意

ここでいう「外部データソース」は広義の定義であり、一般的な外部データストレージシステム(MySQL、Redis などのデータベース)だけでなく、サードパーティシステム(例:Guance コンソール)も含まれます。

前提条件

対応するインストールパッケージをダウンロードし、クイックスタート に従って Func プラットフォームをデプロイする必要があります。

デプロイ完了後、初期化が完了するのを待ってからプラットフォームにログインします。

Func と Guance を関連付ける

コネクタを使用すると、開発者は Guance システムに接続できます。

開発 > コネクタ > コネクタを追加 ページに移動します。

  1. コネクタの種類を選択します。
  2. このコネクタの ID をカスタマイズします。
  3. タイトルを追加します。このタイトルは Guance ワークスペース内にも表示されます。
  4. 必要に応じて、このコネクタの説明を入力します。
  5. Guance ノードを選択します。
  6. API Key ID と API Key を追加します。
  7. 必要に応じて接続性をテストします。
  8. 保存します。

関連付けが完了すると、Func プラットフォームでは以下の 2 つの方法でデータソースをクエリできます。

API Key を取得する方法
  1. Guance ワークスペース > 管理 > API Key 管理 に移動します。
  2. ページ右側の Key を新規作成 をクリックします。
  3. 名前を入力します。
  4. OK をクリックします。システムが自動的に API Key を作成します。API Key 内で確認できます。

詳細については、API Key 管理 を参照してください。

コネクタを使用する

コネクタを正常に追加すると、スクリプト内でコネクタ ID を使用して、対応するコネクタの操作オブジェクトを取得できます。

上記のコネクタを例にとると、このコネクタの操作オブジェクトを取得するコードは次のとおりです。

mysql = DFF.CONN('mysql')

スクリプトを自作する

コネクタを使用する以外に、関数を自作してデータをクエリすることもできます。

ユーザーが MySQL コネクタ(ID を mysql と定義)を正しく作成し、この MySQL に my_table というテーブルが存在し、以下のデータが含まれていると仮定します。

id userId username reqMethod reqRoute reqCost createTime
1 u-001 admin POST /api/v1/scripts/:id/do/modify 23 1730840906
2 u-002 admin POST /api/v1/scripts/:id/do/publish 99 1730840906
3 u-003 zhang3 POST /api/v1/scripts/:id/do/publish 3941 1730863223
4 u-004 zhang3 POST /api/v1/scripts/:id/do/publish 159 1730863244
5 u-005 li4 POST /api/v1/scripts/:id/do/publish 44 1730863335
...

ここで、データクエリ関数を使用してこのテーブルのデータをクエリし、フィールド抽出ルールが次のようになっていると仮定します。

元のフィールド 抽出先
createTime 時間 time
reqCost 列 req_cost
reqMethod 列 req_method
reqRoute 列 req_route
userId タグ user_id
username タグ username

この場合、完全な参考コードは次のとおりです。

  • データクエリ関数の例
import json

@DFF.API('my_table からのデータをクエリ', category='dataPlatform.dataQueryFunc')
def query_from_my_table(time_range):
    # コネクタ操作オブジェクトを取得
    mysql = DFF.CONN('mysql')

    # MySQL クエリ文
    sql = '''
      SELECT
        createTime, userId, username, reqMethod, reqRoute, reqCost
      FROM
        my_table
      WHERE
        createTime     > ?
        AND createTime < ?
      LIMIT 5
    '''

    # 渡される time_range の単位はミリ秒だが、
    # MySQL の createTime フィールドの単位は秒なので変換が必要
    sql_params = [
      int(time_range[0] / 1000),
      int(time_range[1] / 1000),
    ]

    # クエリを実行
    db_res = mysql.query(sql, sql_params)

    # DQL ライクな戻り値に変換

    # タグが異なる場合、複数のデータ系列を生成する必要がある可能性がある
    # データ系列のタグをキーとしてマッピングテーブルを作成
    series_map = {}

    # 元データを走査し、構造を変換してマッピングテーブルに格納
    for d in db_res:
        # タグを収集
        tags = {
            'user_id' : d.get('userId'),
            'username': d.get('username'),
        }

        # タグをシリアライズ(タグキーをソートし、出力を統一)
        tags_dump = json.dumps(tags, sort_keys=True, ensure_ascii=True)

        # このタグのデータ系列がまだ作成されていない場合は作成
        if tags_dump not in series_map:
            # データ系列 series の基本構造
            series_map[tags_dump] = {
                'columns': [ 'time', 'req_cost', 'req_method', 'req_route' ], # 列(1 列目は固定で time )
                'tags'   : tags,                                              # タグ
                'values' : [],                                                # 値リスト
            }

        # 時間、列を抽出し、value に追加
        series = series_map[tags_dump]
        value = [
            d.get('createTime') * 1000, # 時間 time(出力単位はミリ秒。実際に応じて変換が必要)
            d.get('reqCost'),           # 列 req_cost
            d.get('reqMethod'),         # 列 req_method
            d.get('reqRoute'),          # 列 req_route
        ]
        series['values'].append(value)

    # DQL の外側の構造を追加
    dql_like_res = {
        # データ系列
        'series': [ list(series_map.values()) ] # ここではさらに配列でラップすることに注意
    }
    return dql_like_res

データ変換処理のみを理解したい場合や、クエリプロセスを気にしない場合(または実際のデータベースがない場合)は、次のコードを参照してください。

  • データクエリ関数の例(MySQL クエリ部分なし)
import json

@DFF.API('どこかからのデータをクエリ', category='dataPlatform.dataQueryFunc')
def query_from_somewhere(time_range):
    # 何らかの方法で元データを取得したと仮定
    db_res = [
        {'createTime': 1730840906, 'reqCost': 23,   'reqMethod': 'POST', 'reqRoute': '/api/v1/scripts/:id/do/modify',  'username': 'admin',  'userId': 'u-001'},
        {'createTime': 1730840906, 'reqCost': 99,   'reqMethod': 'POST', 'reqRoute': '/api/v1/scripts/:id/do/publish', 'username': 'admin',  'userId': 'u-001'},
        {'createTime': 1730863223, 'reqCost': 3941, 'reqMethod': 'POST', 'reqRoute': '/api/v1/scripts/:id/do/publish', 'username': 'zhang3', 'userId': 'u-002'},
        {'createTime': 1730863244, 'reqCost': 159,  'reqMethod': 'POST', 'reqRoute': '/api/v1/scripts/:id/do/publish', 'username': 'zhang3', 'userId': 'u-002'},
        {'createTime': 1730863335, 'reqCost': 44,   'reqMethod': 'POST', 'reqRoute': '/api/v1/scripts/:id/do/publish', 'username': 'li4',    'userId': 'u-003'}
    ]

    # DQL ライクな戻り値に変換

    # タグが異なる場合、複数のデータ系列を生成する必要がある可能性がある
    # データ系列のタグをキーとしてマッピングテーブルを作成
    series_map = {}

    # 元データを走査し、構造を変換してマッピングテーブルに格納
    for d in db_res:
        # タグを収集
        tags = {
            'user_id' : d.get('userId'),
            'username': d.get('username'),
        }

        # タグをシリアライズ(タグキーをソートし、出力を統一)
        tags_dump = json.dumps(tags, sort_keys=True, ensure_ascii=True)

        # このタグのデータ系列がまだ作成されていない場合は作成
        if tags_dump not in series_map:
            # データ系列 series の基本構造
            series_map[tags_dump] = {
                'columns': [ 'time', 'req_cost', 'req_method', 'req_route' ], # 列(1 列目は固定で time )
                'tags'   : tags,                                              # タグ
                'values' : [],                                                # 値リスト
            }

        # 時間、列を抽出し、value に追加
        series = series_map[tags_dump]
        value = [
            d.get('createTime') * 1000, # 時間 time(出力単位はミリ秒。実際に応じて変換が必要)
            d.get('reqCost'),           # 列 req_cost
            d.get('reqMethod'),         # 列 req_method
            d.get('reqRoute'),          # 列 req_route
        ]
        series['values'].append(value)

    # DQL の外側の構造を追加
    dql_like_res = {
        # データ系列
        'series': [ list(series_map.values()) ] # ここではさらに配列でラップすることに注意
    }
    return dql_like_res
  • 戻り値の例
{
  "series": [
    [
      {
        "columns": ["time", "req_cost", "req_method", "req_route"],
        "tags": {"user_id": "u-001", "username": "admin"},
        "values": [
          [1730840906000, 23, "POST", "/api/v1/scripts/:id/do/modify" ],
          [1730840906000, 99, "POST", "/api/v1/scripts/:id/do/publish"]
        ]
      },
      {
        "columns": ["time", "req_cost", "req_method", "req_route"],
        "tags": {"user_id": "u-002", "username": "zhang3"},
        "values": [
          [1730863223000, 3941, "POST", "/api/v1/scripts/:id/do/publish"],
          [1730863244000,  159, "POST", "/api/v1/scripts/:id/do/publish"]
        ]
      },
      {
        "columns": ["time", "req_cost", "req_method", "req_route"],
        "tags": {"user_id": "u-003", "username": "li4"},
        "values": [
          [1730863335000, 44, "POST", "/api/v1/scripts/:id/do/publish"]
        ]
      }
    ]
  ]
}

管理リスト

接続済みのすべてのデータソースは、インテグレーション > 外部データソース > 接続済みのデータソース で確認できます。

リストでは、次の操作を実行できます。

  • データソースのタイプ、ID、ステータス、作成情報、更新情報などを表示します。
  • データソースを編集し、DataFlux Func、データソースのタイプ、ID 以外の設定を変更します。
  • データソースを削除します。

ユースケース

Guance で外部データソースを使用してクエリを実行する代表的なシナリオは、グラフ > グラフクエリです。

グラフ別のデータ戻り値
折れ線グラフ 円グラフ テーブルグラフ

フィードバック

このページは役に立ちましたか?