jqでURL encodeしcurl

jqの新しい使い方を見つけました。そもそもは Cloudera Manager でも以下のように見れるImpala実行済みクエリーの一覧をREST APIで取ってこようってのがきっかけでした。

image

上のスクリーンショットの赤線の箇所にあるようにこのHadoopクラスターはUS西海岸時間(PST)に存在します。RESTのGET引数で時間ウィンドウを指定でき、そこでのタイムスタンプフォーマットはISO-8601です。

まずは日本時間今日早朝の適当な時間をdateコマンドを使ってISO-8601に変換します。時間帯(timezone)が追加された文字列になります。

$ echo $TZ
Asia/Tokyo
$ date -d "today 4:48" -Isec
2019-12-12T04:48:00+0900

‘+’ (plus) 文字はどうも curl とかいずれかのブラウザーではGET引数中に使う時は URLエンコードする必要があるらしいと気づきました。そこでかなり無理やり、かつオーバースペックですが jq の登場です。

$ date -d "today 4:48" -Isec | jq -s -R -r @uri
2019-12-12T04%3A48%3A00%2B0900%0A

末尾にlinefeedがencodeされた値の%0Aが入ってますがこれは取り除く必要があります。sed でもいいですが今回は”echo –n”を使います。

さて上のコマンドをcurlの引数の中で使ってみます。

$ curl --silent -k -X GET -u admin:pw \
  "http://server:7180/api/v19/clusters/Cluster1/services/IMPALA/impalaQueries\
  ?from=$(echo -n "$(date -d "today 4:48" -Isec)"|jq -s -R -r @uri)\
  &to=$(echo -n "$(date -d "today 4:50" -Isec)"|jq -s -R -r @uri)&limit=1000" \
   | jq -r '.queries[]|.startTime+" , "+.endTime'
2019-12-11T19:49:44.074Z , 2019-12-11T19:49:44.103Z
2019-12-11T19:49:43.469Z , 2019-12-11T19:49:43.633Z

実際はJSONで50行ぐらいのデータが返ってきますが今回は再度 jq を使いました。REST API ではUTC(GMT)でタイムスタンプが返ってきます。日本の早朝なので curl の出力ではイギリスの夜間、上の画面キャプチャーではCalifornia の昼間ですね。

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google photo

You are commenting using your Google account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s