ThoughtSpotのREST APIについて

ThoughtSpotのREST APIについてご紹介します

 

ThoughtSpotのREST APIを利用すると、ThoughtSpotのGUIを使わず、幅広い作業を自動化したり一括処理することが可能です。ただ、REST APIはプログラミングなどが必要だったり、開発者前提の部分があるので、今回はREST APIに関する概要をご説明します。

 

REST APIでどのようなことができますか?

REST APIを使うと、ThoughtSpotのGUIで用意されていないような一括処理や自動化などを行うことが可能になります。例えば、監査ログの自動取得やユーザーの一括削除などが可能です。

また、異なるシステムからThoughtSpotの機能を呼び出すことで、ThoughtSpotの機能を組み込むことが可能です。例えば、異なるシステムにライブボードの画像をそのまま埋め込んだりすることが可能です。

 

具体的なできることのリスト:

  • ユーザーやグループの管理(一括投入・一括削除など)
  • グラフの画像や検索結果を別のシステムに組み込む
  • Spotterを外部から利用する
  • 監査ログの取得
  • ThoughtSpot内の高度な管理
    • 接続、モデル、検索結果、ライブボード等の追加、削除等

 

このREST APIを用いた実装として、ThoughtSpot社のカスタマーサービスが作成した「CS Tools 」というものも利用することができます。すでにCS Toolsで実装できているものであれば、REST APIで構築しなくてもすぐに機能を利用することが可能です。CS Toolsについては別途解説予定となります。

 

REST APIを使うにはどのようにすればいいですか?

REST APIはHTTP/HTTPSアクセスができるものであればなんでも利用することが可能です。プログラミング言語から各種ツールまで幅広く利用が可能です。

  • GUIツール
  • コマンドラインツール
  • プログラミング言語

などが一般的です。

 

GUIツールの利用例

Postmanなどが有名です。ノーコードでAPIが使える数少ない手段です。

 

コマンドラインツール

curlコマンドで使うことができます。Windowsも最近のバージョンではデフォルトで利用可能になっています。

Linux系OSとWindowsで構文が変わるのでご注意ください。curlサンプルはLinuxOSベースのものが多いように思いますが、Windowsではサンプルをペタっと貼り付けて実行などができないことが多いのでご注意ください。

 

プログラミング言語

HTTPアクセスができる言語であればすぐに利用することができます。Pythonであればrequestsを使って実装可能ですし、ライブラリも用意されています。複数のAPIを使って複雑なことを実現するような場合に便利です。

 

よくある質問

  • API v1とv2のどちらを使うべき?

v2.0はv1.0を整理し再構築されたより便利なライブラリで、v1.0でできることはすべて網羅しています。基本的にはv2.0の利用を推奨します。違いについてドキュメント に記載されていますが、v1.0のことは忘れても問題ないと思います。

 

  • さくっと使ってみたい

プレイグラウンドが用意されています。v1.0はSwaggerでしたが、v2.0はAPIMaticになりました。いずれもみなさんがお使いのThoughtSpotのWEB上でそのまま各APIを実行することが可能です。利用するには、開発者権限が必要になるのでご注意ください。

 

  • どのように学習を始めれば良いですか?

ThoughtSpot UniversityのEmbedded Learning PathにREST APIのトレーニング がありますが、ここで一通り学ぶことができます(英語です)。

 

  • Pythonのライブラリを使ったほうが良いですか?

Pythonをお使いの場合、thoughtspot_rest_api_v1_python というライブラリを利用することが可能です。このライブラリを使うと、コードをシンプルに書くことが可能で、非常に便利です。

ただし、最新機能(例えば、ThoughtSpot v10.13時点ではai_agent系のAPIなどが該当)などはすぐに使うことができません。最新機能を使ってみたい場合は、ライブラリを使わずに実装する必要があります。

 

実際に使うには?

実際にAPIを使う場合、認証を通してから各APIを使う必要があります。つまり、以下のようになります。

 

プレイグラウンドでは認証は自動的に行われる仕組みになっているため、ライトに使いたい場合はプレイグラウンドで十分ですが、本格的に利用する場合は、認証を通すところから行う必要があります。REST APIに不慣れな場合、この認証を通すのに苦労することが多いです(ThoughtSpotに限らず、様々なシステムにおいてこの認証を行う部分はかなり癖が出る部分です。簡単なシステムはAPIキー一本で済むケースもありますし、非常に面倒なステップを踏まないとできないケースもあります)。

チュートリアルでは、ユーザー名とパスワードを使ってフルアクセストークンを取得する方法が紹介されていますが、これは開発用もしくはテスト向けで、本格運用の場合は信頼された認証(Trusted Authentication)でシークレットキーを使うのが良いかと思います(なお、ローカル認証のMFAをオンにした場合はユーザー名とパスワードを使った認証は使えなくなるので、シークレットキーを使った認証が推奨となります)。

シークレットキーの取得方法は以下URLを参照ください。

サンプルコード(Python)

それでは、実際のPythonのコードをご紹介します。ここではPythonのライブラリは使っていません。

行っていることはおおまかには以下のとおりです。

  1. アクセス準備
  2. Get Full Access Token APIでトークンを取得
  3. 取得したトークンでセッションのヘッダをアップデート
  4. Fetch Answer Data APIで保存済みのAnswerからデータを取得

 

コード自体は以下のとおりですが、「*****」と表記のある部分をご自分の環境に合わせて設定をお願い致します。また、org_idの部分も同様に合わせこみをお願いします(PrimaryOrgしかない場合は0で大丈夫かと思います)。

import requests

#-----------ユーザー情報設定(Start)----------#
#ThoughtSpotのURLとユーザー情報を設定
thoughtspot_url = "https://*****.thoughtspot.cloud" # *****部分をお使いのクラスタに書き換えてください
org_id = 0 #Playgroundで「Get Current User Info」を叩くとすぐわかります
post_data = {
  "username": "*****" # 利用する方のユーザー名に書き換えてください
  "password": "*****", # 利用する方のパスワードに書き換えてください
  "validity_time_in_sec": 300,
  "org_id" : org_id,
  "auto_create": False
}
#-----------ユーザー情報設定(End)----------#

#-----------基本設定(Start)----------#
api_version = '2.0'
base_url = '{thoughtspot_url}/api/rest/{version}/'.format(thoughtspot_url=thoughtspot_url, version=api_version)
api_headers = {
    'X-Requested-By': 'ThoughtSpot',
    'Accept': 'application/json'
}
#-----------基本設定(End)----------#

#-----------FullToken取得(Start)----------#
#Get Full Access Token APIを使用
api_endpoint_ending = "auth/token/full"

# 新規セッションを作成
requests_session = requests.Session()
# セッションにヘッダを適用
requests_session.headers.update(api_headers)
# アクセスするAPIのURLを作成
url = base_url + f"{api_endpoint_ending}"

try:
    # APIアクセスを実施
    resp = requests_session.post(url=url, json=post_data)

    # HTTPのレスポンスが2XXでなければエラーとする
    resp.raise_for_status()

    # レスポンスのJSONボディを取得し、Dictに変換します
    # 一部のエンドポイントは成功時に200ではなく204を返しますが、ボディは返されません。.json()メソッドを呼び出すとエラーが発生します
    resp_json = resp.json()

    #取得したトークンを格納
    token = resp_json["token"]
    print("Here's the token:") #不要なら削除可能
    print(token) #不要なら削除可能

except Exception as e:
    print("Something went wrong when trying to get a token:")
    print(e)
    print(e.request)
    print(e.request.url)
    print(e.request.headers)
    print(e.request.body)
    print(e.response.content)
    exit(1)

# APIヘッダに取得したトークンを追加
api_headers['Authorization'] = 'Bearer {}'.format(token)
requests_session.headers.update(api_headers)
#-----------FullToken取得(End)----------#

#-----------以下はやりたいことに応じて編集----------#
# Example: Fetch Answer Data
user_search_url = base_url + "metadata/answer/data"
json_post_data = {
  "metadata_identifier": "3a3ef06b-7774-4c58-bdf9-124bac02c0f5", #保存済みAnswerのguid
  "data_format": "COMPACT",
  "record_offset": 0,
  "record_size": 10
}
try:
    search_resp = requests_session.post(url=user_search_url, json=json_post_data)
    search_resp.raise_for_status()
except Exception as e:
    print("Something went wrong:")
    print(e)
    print(e.request)
    print(e.request.url)
    print(e.request.headers)
    print(e.request.body)
    print(e.response.content)
    exit(1)

#結果を表示
print("Here's the response:")
print(search_resp.json())

 

結果としては以下のようなデータが得られます。今回利用したAPIからはJSON形式のデータが得られています。

 

{'metadata_id': '3a3ef06b-7774-4c58-bdf9-124bac02c0f5', 'metadata_name': '20251010', 'contents': [{'available_data_row_count': 3, 'column_names': ['カテゴリ', 'Total 数量'], 'data_rows': [['家具', 8369], ['事務用品', 23268], ['テクノロジー', 7017]], 'record_offset': 0, 'record_size': 10, 'returned_data_row_count': 3, 'sampling_ratio': 1}]}

 

実際にほしいところは、「'data_rows': [['家具', 8369], ['事務用品', 23268], ['テクノロジー', 7017]]」でしょうか?

 

ちなみに、もともと保存されたAnswerはこのような結果でした。

 

実際に使う場合、このコードでは再利用可能な部分もベタ打ちしているので、関数化するなりしてコードをコンパクトにして再利用しやすくした方が良いかと思います。

 

コツ

APIで送信するデータ本体は、使用するAPIのエンドポイントによって異なります。基本的にThoughtSpotのREST APIの送信データはJSON形式となっているため、この書式を再現するのがめんどくさい場合は、プレイグラウンドで一度設定し、それをコピペすると非常に楽になります。

例えば、Fetch Answer Data APIをセットすると、以下のようにリクエストが作成されます。赤枠内の{}部分をそのままPythonコードとしてコピペすればほぼそのまま利用可能です。

 

True/Falseは大文字、小文字の違いがあるため、そこはPythonコードの方に合わせこんでください。また、{}を囲むシングルアポストロフィーはPythonでは不要です(つまり、{}内をそのままコピペしてください)。

 

まとめ

  • ThoughtSpotのREST APIの概要についてご紹介しました
  • よくある質問について質問を答えを記載しました
  • シンプルなサンプルコードをご紹介しました

REST APIを使うことでThoughtSpotの管理を簡単にしたり、GUIからできないことを行ったり、外部システムとの連携なども可能になります。ぜひ使いこなしてみてください。

 

関連リンク

Developersページのドキュメントです。

ThoughtSpot API v1とv2の違いの解説。

ThoughtSpot UniversityのラーニングパスのREST API関連の教育コンテンツです。本格的に使いたい場合は受けておくことを推奨します。

Pythonのライブラリです。

 

 

 

おすすめの記事