コンテンツにスキップ

外部データソース


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'),
        }

        # タグをシリアライズ(tag key をソートして出力を一貫させる)
        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()) ] # ここでさらに 1 段階配列でラップすることに注意
    }
    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'),
        }

        # タグをシリアライズ(tag key をソートして出力を一貫させる)
        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()) ] # ここでさらに 1 段階配列でラップすることに注意
    }
    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 つは、グラフ > グラフクエリです。

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

フィードバック

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