newrelic.android.jarの仕様でエラーが出てハマった
※ この記事は、2013年11月時点での情報です。もしかしたらもう仕様が変わってるかもしれません。
NewRelicは、サーバーやフロントのパフォーマンスをレポートしてくれるモニタリングツールです。どれだけイケてるかはこちらを見てみてください。
実はすでにAndroid、iOS向けのSDKもリリースしていて、簡単な手順で組み込めるようになっています。AndroidSDKを導入してみたのですが、manifestとActivityにちょちょっと書くだけで簡単に導入できちゃいました。aspectで動的にレポート用のコードを組み込んでいるようです。
そんな素晴らしいNewRelicですが、SDK部分でハマってしまって運営に問い合わせた結果、仕様だということがわかったので備忘を記録しようと思います。
1.あるHTTPリクエストを送ったらエラーが出た
ことの発端は、あるHTTPリクエスト送信時にエラーが発生したことでした。以下のスタックが吐き出されていました。
08-08 19:35:10.471: W/System.err(1451): at java.lang.String.startEndAndLength(String.java:593) 08-08 19:35:10.471: W/System.err(1451): at java.lang.String.substring(String.java:1474) 08-08 19:35:10.471: W/System.err(1451): at com.newrelic.agent.android.instrumentation.TransactionStateUtil.inspectAndInstrument(TransactionStateUtil.java:107) 08-08 19:35:10.471: W/System.err(1451): at com.newrelic.agent.android.instrumentation.Instrumentation._(Instrumentation.java:189) 08-08 19:35:10.471: W/System.err(1451): at com.newrelic.agent.android.instrumentation.Instrumentation.execute(Instrumentation.java:104) 08-08 19:35:10.481: W/System.err(1451): at com.xxx.net.PreloadTask.doInBackground(PreloadTask.java:49) 08-08 19:35:10.481: W/System.err(1451): at com.xxx.net.PreloadTask.doInBackground(PreloadTask.java:1) 08-08 19:35:10.481: W/System.err(1451): at android.os.AsyncTask$2.call(AsyncTask.java:264) 08-08 19:35:10.481: W/System.err(1451): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305) 08-08 19:35:10.481: W/System.err(1451): at java.util.concurrent.FutureTask.run(FutureTask.java:137) 08-08 19:35:10.481: W/System.err(1451): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076) 08-08 19:35:10.481: W/System.err(1451): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569) 08-08 19:35:10.481: W/System.err(1451): at java.lang.Thread.run(Thread.java:864)
なんか明らかにcom.newrelicあたりでエラーが出てるんですけど・・・と思いながらググってみても特に情報はありませんでした。
2.newrelic.android.jarを外すとエラーが出ない
まさかまさかと思いながらnewrelic.android.jarを外してみると、なんとエラーが解消しました。
こいつは問い合わせるしかないと思い、サポートセンターにメールを送ることにしました。
3.メールで問い合わせる
とりあえずNewRelicへの感謝の気持ちも添えて、以下のメールを送ってみました。
Hi. I am Yusuke Konishi, Japanese Android Developer.
Thanks for newrelic, it is easy to monitor performance. Thank you NewRelic!
Today, I want to ask NewRelic team about Mobile Monitoring.
I use Android Monitoring, but sometimes newrelic.android.jar occers error.
This is stacktrace.
————————————
・・・
————————————
The thing I did is to request data by DefaultHttpClient.
PreloadTask.java:49
HttpResponse response = client.execute(new HttpHost(Consts.APP_HOST), request);
Once I remove newrelic.android.jar, error didnot occur.
So I need your help. Please tell me the solution.
Yusuke Konishi
すると、自動的に返信が来て、なんと専用のIssueとして扱うサポートページが作られていました。NewRelicすごい・・・。サポート体制までバッチリです。とりあえず返信を待ってとのことだったので、待つ間に切り分けをしてみることにしました。
4.URLが短いとダメだった
requestのURLが、/xxxx と4文字だったのですが、これを/xxxxxxxxxx と10文字にしてみたところ、エラーがでなくなりました。文字数を変えて検証すると、最低でもリクエストURLが10文字以上でないとダメみたいでした。
これはきな臭いなぁと思いながらサポートページにこの結果をコメントで追記しておいたところ、返事が来ました。
「リクエストURLは最低でも10文字はなきゃダメだよ。http://とドメインをつけて試してみて!」
とのこと・・・。やっぱりね、となったのでした。
(結論)NewRelicのサポートすごい
なんでそんな仕様なのかはわかりませんが、一応直りました。仕様は置いておいて、NewRelicのサポート体制はすごかったです。すごい効率的にサポートしてるんだろうなぁと感じられました。MongoLabやAWSもそうですが、やはりこういう計測やインフラは専門チームにお任せしたほうがいいなとしみじみしました。
おしまい。