コンテンツにスキップ

外部データソース


DataFlux Func を使用すると、MySQL、Prometheus など、さまざまな種類の外部データソースを Guance に接続できます。また、TiDB Cloud Lake に直接接続して、データの統合クエリと可視化を実現することもできます。

機能

  • ネイティブクエリ:グラフ内でデータソースのネイティブクエリ文をそのまま使用でき、特別な変換は不要です。
  • データ保護:Func データソースの接続情報はローカルの Func に保存されます。TiDB Cloud Lake の Lake DSN はプラットフォームによって暗号化されて保存され、パスワードや完全な DSN はリスト、詳細、クエリで表示されることはありません。
  • カスタム管理:実際のニーズに応じて、さまざまな外部データソースを簡単に追加および管理できます。
  • リアルタイムデータ:外部データソースに直接接続してリアルタイムでデータを取得し、即座に応答して意思決定を行います。

接続方式

接続方式 対応データソース 説明
DataFlux Func 経由 MySQL、Prometheus など 既にデプロイされている DataFlux Func と Connector を再利用します。ID などの既存の設定は変更しないでください。
TiDB Cloud Lake 直接接続 TiDB Cloud Lake Guance サーバーが TiDB Cloud Lake Driver を介して接続します。DataFlux Func に依存せず、データソース ID の入力も不要です。

TiDB Cloud Lake に直接接続する必要がある場合は、「TiDB Cloud Lake の接続とクエリ」 を参照してください。

DataFlux Func 経由の接続

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. 確定 をクリックします。システムが自動的に 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 ライクな戻り値に変換

    # タグが異なる場合、複数のデータ系列を生成する必要がある場合がある
    # データ系列のタグを Key としてマッピングテーブルを作成
    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 ライクな戻り値に変換

    # タグが異なる場合、複数のデータ系列を生成する必要がある場合がある
    # データ系列のタグを Key としてマッピングテーブルを作成
    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 で外部データソースを使用してクエリを行う典型的なユースケースの 1 つは、グラフ > グラフクエリです。

異なるグラフのデータ返却
折れ線グラフ 円グラフ テーブルグラフ

フィードバック

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