LoginSignup
21
2

More than 3 years have passed since last update.

ちょっとしたTipsまとめ

Last updated at Posted at 2020-12-01

一年間ほど業務している中で発見した、ちょっとしたTipsを集めてみました。

digdag

digdagはCronのようにコマンドを定期実行してくれるOSSです。
ちなみに、TreasureDataさんが作成されています。

sh:>でfor_eachに設定した変数を確認する

main.dig
# サンプルコード
+load:
  for_each>:
    alphabet: [
      a,
      b,
      c
    ]
  _do:
    sh>: |
      if [ ${alphabet} = "c" ]; then exit 1; fi;
      echo ${alphabet}
    _error: ## ここ
      sh>: env | sort

サンプルコードの流れ

  • for_eachでalphabetがcのときに、_doでエラーが発生して、実行が止まる
  • エラーを_errorでキャッチして、環境変数を表示する
# 実行結果
> digdag run --rerun --log-level error error_in_for_each.dig
2020-XX-XX XX:XX:XX +0900: Digdag v0.9.41
a
b
2020-XX-XX XX:XX:XX +0900 [ERROR] (0026@[0:default]+error_in_for_each+load^sub+for-0=alphabet=2=c): Task failed with unexpected error: Command failed with code 1
java.lang.RuntimeException: Command failed with code 1
    at io.digdag.standards.operator.ShOperatorFactory$ShOperator.runTask(ShOperatorFactory.java:143)
    at io.digdag.util.BaseOperator.run(BaseOperator.java:35)

## 省略

alphabet=c

ShOperator関数の仕様で、sh>: の部分で起きたエラーはexitコードのみを結果として返しているぽいです。
エラー発生時のfor_eachで設定した変数の中身は、_errorをsh:>の直下に移動させると確認できます。

参考URL

サンプルコード

Embulk

Embulkはcsvやmysqlなどのデータを別のデータ形式に変換して、データ移行までやってくれるOSSです。

migrateする元のDBのカラムに 0001-01-01 00:00:00 より小さい日付がある

MySQLからMySQLへデータをマスキングしてmigrateするような使い方の場合、
EmbulkではJDBCのドライバを使うので、その仕様に引っ張られて想定していないデータの変換がありました。

例えば、 0000-01-01 00:00:00 というデータを持ったカラムがmigrate元のDBにあるとします。
これをEmbulkを通してmigrateすると、 0001-01-01 00:00:00 という値に自動で変換されます。

Embulkのコード的には、zeroDateTimeBehaviorがconvertToNullなので、Roundされないかなと思ったんですが、しっかりRoundされました。

回避方法としてはafter_loadのオプションを使って、migrate後にデータの書き換えを行いました。

out:
  type: mysql
  user: {{ to_user_name }}
  password: {{ to_db_password }}
  database: {{ to_database_name }}
  table: {{ to_table_name }}
  host: {{ to_database_host }}
  select: '*'
  mode: merge
  merge_rule:
    - 'id=VALUES(`id`)'
  create_table_constraint: '
    KEY `index_name` (`name`)
  '
  column_options:
    id: { type: 'int(20) primary key NOT NULL AUTO_INCREMENT' }
    name: { type: 'varchar(20)' }
    deleted_at: { type: 'DATETIME(0) NULL' }

#  ここ
  after_load: '
    UPDATE {{ to_table_name }}
    SET deleted_at = "0000-01-01 00:00:00"
    WHERE deleted_at = "0001-01-01 00:00:00";
  '

Embulkでダミーデータを使いたい

Embulkでは gem install が可能です。
GemのバージョンはEmbulk依存なので、多少の調査は必要ですが、Fakerは1.9.1が使えました。

$ embulk gem install faker -v '1.9.1'

filterの項目で、ruby_procと組み合わせて、ダミーデータを挿入可能です。

_config.yml.liquid
filters:
  - type: ruby_proc
    requires:
      - faker
    columns:
      - name: name
        proc: |
          ->(name) do
            name = Faker::Name.name
          end

参考URL

サンプルコード

Gatling

Gatlingは高機能な負荷試験ツールです。

負荷試験中のHTMLレスポンスを後で確認したい

通常では負荷試験中のレスポンスは表示されません。
以下のように、ログレベルをTRACEに変更して、 htmlファイルにパイプすると確認できます。

logback.xml
    <root level="WARN">
        <appender-ref ref="TRACE" /> // ここ
    </root>
$ docker-compose run gatling gatling/bin/gatling.sh |\
  tee results.html && open results.html

HTMLのタグから値を取得して、次のリクエストに使いたい

例えば、一度レスポンスを取得してから再度、別のリクエスト時にその値を使う場合があります。
そういうときは、cssのコマンドを使うと便利です。
以下の例だと、metaタグ内のnameにcsrf-tokenが設定されているcontentを取得して、POSTのリクエストに使ったりできます。

    var TestEndpoint = exec(http("get test")
        .get(s"/test")
        .check(css("meta[name=\"csrf-token\"]", "content").saveAs("token"))
        .check(status.is(200))
      )
      .pause(1)
      .exec(http("post test")
        .post(s"/test")
        .formParam("token", "${token}")
        .check(status.is(200))
      )

参考URL

サンプルコード

21
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
21
2