Salesforceから取引先データをとってきてみよう、秋の日に

  • #技術ブログ 

もうこの際、月一連載でいいのかなと思い始めている、相変わらず思考が半人前のうえピーです。

今回のネタはといいますと、*****祝***** Salesforce連携!!
ということで、有名なSalesforceさんから、弊社のAPIを呼び出してもらうだけでは申し訳ないので、
こちらからもお伺いしようと思い、私のログ収集サーバー(flentd)から、取引先データをとってこようと思います。
※ただ、何か悪い予感がするのは、喉が痛くて咳が止まらないせいなのか、、、。

不安は置いておいて、早速pluginを探して、あったらさくっと設定して、ブログも過去最短の行数で終わらせちゃお。

なーんて、淡い期待を抱きつつ、Google先生に聞いてみますと、ありました!!!
sforce

よっしゃー、早速インストールじゃい!!!

# /usr/sbin/td-agent-gem install fluent-plugin-sforce

おぉ、思いのほかさくっとインストールに成功、よっし。
このまま、td-agent.confにも追記じゃー、まずはファイルに取引先データを出力と。

<source>
  tag sforce.account
  type sforce
  username ひ・み・つ
  password ひ・み・つ
  query select id,name,Industry from account
  polling_interval 60
  # topic AllMessages
</source>

<match sforce.account>
  type file
  path /tmp/sforce_account.csv
</match>

それでは、サービスを再起動しましょ。うふふ、今日は久しぶりの早帰りかな。

# service td-agent restart
Restarting td-agent: td-agent                              [失敗]

orz、嘘やろー、、、

10分ほど、思考を停止させた後、/var/log/td-agent/td-agent.logを参照いたしますと、
「2017-09-01 17:42:51 +0900 [error]: dry run failed: uninitialized constant Fluent::Input」
※うん、原因これだよね。

とりあえず、プラグインのソース見てみよう。ソースのリンクはこちら
※頭がボーっとしていたせいなのか、素直にGoogle先生に「dry run failed: uninitialized constant Fluent::Input」ってなぁにと聞かなかった私。

「おぉ、現在日付けで絞っとるやん、こりゃデータが0件だったからやな。取引先データはそんなに頻繁に登録しないし。」
※0件で落ちるって、そんな作りなわけ、あぁ、だれか止めてあげて、、、お家に帰れなくなる、、、

よっしゃー、この際、Rubyも覚えてやるわい!!
※あぁ、どつぼに嵌る予感、、、

おっし、単体テストクラス発見!!ソースのリンクはこちら
※方向性は、誤っているけど、ノウハウたまるからまぁいいか。

ここに記載しているusernameとpasswordとqueryを変更してっと

# cd /opt/td-agent/embedded/lib/ruby/gems/2.1.0/gems/fluent-plugin-sforce-0.0.2/
# /opt/td-agent/embedded/bin/rake test

あら??エラーなし。なんで??
※ログのエラー内容を思い出して、お願いだから。

ふーむ、assert_equalでconfigの設定が正しくロード出来たかしか確認してないじゃん!!
これじゃあ、テストにならんやろ。
※おぉ、まだ脱線するのか。

うーん、でもこの作りでは、確かに単体テストでチェックできるのはconfigロードくらいかも。
そうだ!!!
confingのtopicに、testっていれると、soqlを一回だけ実行する処理に分岐するようにしちゃお。
とりあえず、取得内容を標準出力にっと。
※もう、勝手にして、、、

# in_sforce.rbより、追記した箇所抜粋
      # uehara add
      elsif @topic == "test"
        th_low = DateTime.now().strftime("%Y-%m-%dT%H:%M:%S.000%Z")
        th_high = DateTime.now().strftime("%Y-%m-%dT%H:%M:%S.000%Z")
        where = "CreatedDate <= #{th_high} AND CreatedDate > #{th_low}"
        soql = "#{@query} WHERE #{where}"
        log.info "query: #{soql}"
        records = client.query(soql)
        records.each do |record|
          log.info "#{record}"
          print("#{record}")
        end

# cd /opt/td-agent/embedded/lib/ruby/gems/2.1.0/gems/fluent-plugin-sforce-0.0.2/ # /opt/td-agent/embedded/bin/rake test

おぉ、データ取れてる、取れてるって?????
なんで取れるの???
※やっと気付いた、、、

教えてGoogle先生、
「dry run failed: uninitialized constant Fluent::Input」
検索、ポッチっと。

「add following line on the top of the file require ‘fluent/input’」

えっ?そうこと

# in_sforce.rbより、追記した箇所抜粋
# uehara add
require 'fluent/input'

そして、

# service td-agent start
td-agent td-agent:                                         [  OK  ]

やっと起動。

紆余曲折あったけど、
# vi /tmp/sforce_account.csv

???、空っぽ!!!
あぁ、直近で登録したデータがないからか、、、!!!

頻繁に登録されないデータに「flentd」使うの間違ってる!!!orz

ということで、次回「Batch版flentd、embulkでリベンジ!」をお楽しみに。