アルパカログ

カスタマーサポート(CS)とエンジニアリングを掛け算したいCRE(Customer Reliability Engineering)エンジニアが気になる技術や思ったことなど。

Zendesk REST API で複数のチケットフィールドを指定してチケットを検索する

3年前から業務で Zendesk App を作っています。 Zendesk は開発者向け機能が豊富に提供されているところが良いですね。

今日は Zendesk REST APISearch API を使い複数のチケットフィールドを AND 指定してチケットを検索する方法について説明します。が、 Undocumented な方法のため使用は自己責任でお願いしますね。

リクエスト URL

チケットを検索する場合のリクエスト URL は下記のようになるでしょう。

/api/v2/search.json?query=type:ticket {query}&sort_by={sort_by}&sort_order={sort_order}&page={page}

チケットフィールドを含め検索条件は query で指定します。

チケットフィールドの指定

チケットフィールド (カスタムフィールド) の条件は Zendesk Support search reference にあるとおり fieldvalue:12345 のように指定します。

ここで気を付けなければならないのは 12345 の部分は ID ではなく値であるということです。

AND 条件

fieldvalue:12345,67890 のようにスペースを入れず CSV で指定します。


最近は過去に App Framework v1 で作った Zendesk App を v2 に書き換えて少し知見が溜まったので、また気が向いたら書きたいと思います。

logrotate されたログファイルを reopen する

あるデーモンプロセスのログが消えていることに気付きました。
厳密には、 restart した日はログがあるのに、日付が変わってからのログが空っぽなのです。
ログが消えるのは開発者にとって悪夢です。折しも障害発生なんてことがあれば…恐ろしくて想像したくないですね。
今日はデーモンプログラムのログを logrotate によりローテーションさせたときに発生する問題とその解決策についてお話ししたいと思います。

続きを読む

ERB の partial が重かった話

業務で開発・保守している社内向け Web アプリケーションの画面の一つが重くて開けなくなりました。
エラーログからはタイムアウトにより unicorn プロセスが kill されていることがわかりました。
該当画面では3000レコードを DB から取得して一覧表示しようとしていましたが N+1 問題は解決済みで Slow Query は出ていません。
プロファイリングの結果 ERB テンプレートで使用している partial が重いということが判明しました。

サンプルコード

サンプルには Rack アプリケーションとして Sinatra を、プロファイリングには Rack::Lineprof を使用しました。

app.rb

require "sinatra"
require "rack-lineprof"

use Rack::Lineprof

get "/" do
  erb :index
end

views/index.erb

<% 2000.times do %>
  foo
  <%=erb :partial, layout: false %>
<% end %>

views/partial.erb

bar

プロファイリング結果

[Rack::Lineprof] ===============================================================

views/index.erb
 229.8ms     1 |   1  <% 2000.times do %>
   3.2ms  2000 |   2    foo
 192.8ms 10000 |   3    <%=erb :partial, layout: false %>
               |   4  <% end %>

partial で時間がかかっているのがわかります。
今回のケースですとループの中で複数の partial を使用しており、それぞれ数秒程度かかっていました。
解決方法としては、場合分けや計算等が目的であれば helper メソッドを使う、日時フォーマットの変換が目的であれば I18n を使うことが挙げられます。

YAPC::Asia 2015 に参加しました

YAPC::Asia に参加したのは2013年以来2度目で、今年の会場は東京ビッグサイト会議棟でした。

今回1番勉強になったトーク@kazeburo 氏の ISUCONの勝ち方 - YAPC::Asia Tokyo 2015 で、内容は主に ISUCON で重要となるアプリケーションや MySQL のチューニングについてでした。
ISUCON だけでなく普段の業務にも活用できる非常に有益な情報だったので、学んだことを記憶の範囲でまとめます。

続きを読む

モバイル向けアンケートサービスのソースコードを公開しました

Satisfactory Mobile というモバイル向けアンケートのソースコードGitHub で公開しました。

スクリーンショット

f:id:otoyo0122:20150822145049p:plain f:id:otoyo0122:20150822145050p:plain

デモ

https://satisfactory.mobi/

特長

UI には jQuery Mobile 1.4 を使っていて、全てではないですがなめらかな画面遷移をします。
サーバーアプリケーションは PythonDjango で、DB は MySQL を、リバースプロキシとして Nginx を使っています。
fabric で書かれたデプロイツールも入っていて、デプロイだけでなく Nginx によるメンテナンスON/OFFの切り替えも可能です。

経緯

Satisfactory Mobile は今年2月から休日を使って1ヶ月強で作ってリリースしました。
しかしその後、Google Adwords などを使ってプロモーションを実施するもユーザは増えず、サービスを世に広めることの難しさを痛感しました。
必要とされないサービスはクローズするしかありませんが、せっかく作ったのにこのまま消してしまうのはもったいないですし、ソースコードを公開すれば誰かの役に立つかもしれないと思い、今回オープンソースという形で公開することにしました。
何かのお役に立てば幸いです。

感想・Issue・PR お待ちしています!

github.com