tjinjin's blog

さらなる高みに1nmずつ近づくブログ

fluent-plugin-bigqueryを使ってログをbigqueryに流してみる

About

ログをfluentdを通してbigqueryに投げるところを試してみました。今回は適当なログで試してますが、nginxのログとかをやってみたいところです!

事前準備

gcpのアカウントを作成

  • projectを作成する
  • サービスアカウントを発行する(今回はjson
  • datasetを作成する(データベースのようなもの)

設定

fluentdの設定

前提として下記のpluginが必要です。

chefを使っており、templateになっています。/etc/td-agent/conf.d以下に配置します。

<source>
  @type tail
  format none
  path /var/log/messages
  tag os.messages
  pos_file /var/log/td-agent/os.messages.pos
</source>

<source>
  @type tail
  format none
  path /var/log/secure
  tag os.secure
  pos_file /var/log/td-agent/os.secure.pos
</source>

<match os.**>
  @type forest
  subtype copy
  <template>
    <store>
      @type bigquery
      method insert

      auth_method json_key
      json_key /etc/td-agent/<%= @json_key %>
      project <%= @bq_project_id %>
      dataset <%= @dataset %>

      flush_interval 1
      buffer_chunk_records_limit 1000
      buffer_queue_limit 1024
      num_threads 16

      auto_create_table true
      table <%= @table_name %>_%Y_%m

      time_format %s
      time_field time

      schema_path /etc/td-agent/os.test.schema
      field_integer time
    </store>
  </template>
</match>
  • 鍵の指定はp12でもよいのですが、今回はjsonにしました。深い理由はないですが、こちらの方が簡単な気がしました。
  • auto_create_tableを設定しているため、勝手にtableが作成されます(初回ログ送信時にtableが作成されます)。今回のように<%= @table_name %>_%Y_%mとしておけば月毎のログを管理できそうです。
  • tableにどんな形式でデータを投入するか指定を schema_pathでしています。

2016/02/01追記

  • 上記のsource設定では下記のschemaを指定してもデータがnullになってしまいます。tailではmessageという名前でデータが入った覚えがありますので、"name": "message" とするとデータが入るはずです(未検証)
[
  {
    "name": "json",
    "type": "STRING"
  }
]

このデータに入れるには下記のようにログを送信すればよいです。

$ echo'{"json": "message"}' | fluent-cat os.test

まとめ

なんとなく使い方が分かりました!