freedom-man.com

ブログは俺のセーブポイント

Tag: visualforce

Apexでコミュニティユーザを作成する

Apexでコミュニティユーザを作成する方法の備忘録

Continue reading

elasticsearch+kibanaでSFDCのアクセスログ取ってみる。

fluentd+elasticsearch+kibanaの構成でログ解析をすることが流行っているらしい!

 

ということで、今回はSFDCの画面からアクセスログを取ってelasticsearch+kibanaで

ビジュアライゼーション&解析するっていうことをやってみました。

(個人的に一般ユーザのアクセスログだけじゃなく、管理する側のアクセスログとか取って解析して

何か面白いもの見れないかなーなんて思ってます。)

 

流れとしては

SFDCからelasticsearchにデータを登録する

→elasticsearchのデータをkibanaで見る

って感じ。

 

elasticsearchとkibanaのインストール・セットアップ方法に関しては以下を参照ください!

fluentd + Elasticsearch + Kibanaで始めるログ解析 (セットアップ編)

 

0. SFDCからデータ登録をする際の方針

SFDCのお知らせ等のサイドバーコンポーネントにデータ登録用のスクリプトか何かを

埋め込むという方式で行いますが、方法としては

 

a. お知らせにJavaScriptを埋め込んでajaxでelasticsearchにデータを飛ばす

b. お知らせに埋め込んだJavaScriptでVFを呼び出すscriptタグあるいはiframeタグを動的に生成して、

そのVFページ(Apex)からelasticsearchに対してコールアウトする。

 

の2パターンがありそうですが、aはCORSの対応が必要が面倒そう(っていうかハマった…orz)なので

今回はbのApexからコールアウトする方式で!

 

1. Visualforceページ + Apexクラスの作成

こんな感じで

 

 

リモートサイトの設定で対象ドメイン、ポートに対するコールアウトを許可するのも忘れずに。

 

あと、今回は非SSLのhttpで認証なしにやってますが、実環境でやる場合はhttps+basic認証とかで

セキュアにelasticsearchにアクセスできる仕組みを作ってやってください。

サーバサイドのポート9200に対するIPフィルタリングも有効だと思います。

 

CSRFは特に対策しなくも良いかと思います(ログ作られるだけだし)

 

2. お知らせにスクリプト埋め込み

以下のようなスクリプトを埋め込む。

これによって動的にLoggerScriptページをパラメータ付きで呼び出して、elasticsearchにデータ登録を行う。

 

注意点としてはお知らせのスクリプト内に空行を入れると<p>タグが自動的に付与されるっぽいので

空行は作らない方が良いです。

 

あと、カスタムコンポーネントのhtmlエリアでも同様のことはできるけど

プレビュー機能でscriptが動いて編集がし辛かったりするので

標準画面にJS埋め込みとかやりたい場合はお知らせがオススメ。

 

あとは、このお知らせコンポーネントをホームページのページレイアウトに追加するだけ!

ユーザインターフェースで”すべてのページにカスタムサイドバーコンポーネントを表示”にチェックをつけるのもお忘れなく。

 

で、適当にSFDCの標準画面を彷徨って、ログの収集結果をkibanaで見るとこんな感じにグラフ化される。

kibana-sf

 

入力データはこんな感じ。

kibana-sfrec

 

んー、ドメインをデータとして入れちゃうと上位に入っちゃうから 、パスだけにした方が良いかも。

仕組み上レポート、ダッシュボードみたいにサイドバーが出てこない系コンテンツは

ログが取れないのは難点っすね…。意味のあるデータを集めたい場合はもうちょい工夫が必要そう。

アクセスログレベルの解析だったらGA使えって話だしw

 

 

※aパターンで実装した場合

ちなみに、aパターンで書くとVFページだけで書けちゃいます。

(お知らせscriptだけでもイケそうですが、ユーザコンテキストとかをAPIコール無しに取得するにはVFが必要)

ただし、CORS対応しないと動かないです。

apex:Messageの挙動について調べてみる

force.comでフォーム的な画面を作ることはよくあると思いますが

その際に<apex:inputField>とかでVFを組んでると、必須項目の制約とかメールアドレスの形式チェックとか

Salesforceのシステムバリデーションが効いてくれる上に

型に合わせてhtmlを生成してくれるから日付型とか使うときに便利だったりします。

 

が、<apex:inputField>でシステムが出すバリデーションは”エラー: 値を入力してください”

というように決められた文言でしか出すことができずエラーを出す位置も決まってしまうため

Salesforceのオペレータ側ではなく対顧客に対するフォームを作成するときには

デザイン・UI的にちょっと難が…。

 

そこで<apex:message>というのを使ってみようと思ったけど、

色々と苦戦した挙句、挙動が?だったので、ちょっと書いてみる。

 

パターン1. <apex:inputField>のみ

検証用VFページ↓

以下のように固定のエラーメッセージが出る。

inputfieldのみ

このメッセージを自由に変更して、自由な位置に出力したい!というのが今回の趣旨。

 

パターン2. <apex:inputField> + <apex:message/>

では実際にmessageタグを使ってみる。

検証用VF↓

こうすると、inputFieldタグが出すエラーメッセージと

messageタグが出すエラーメッセージで2重に出力されちゃう。

inputfield_message

 

パターン3. <apex:inputField> + <apex:message/> + commandButtonのimmediate

SalesforceのSystemバリデーションを走らせないで送信したらどうなるかを検証。

結果、commandButtonのactionで何もしていないせいか何も出力されず…。

空送信フォーム

 

パターン4. <apex:inputField> + <apex:message > + immediate + action指定

実際にアクションでインサートしてエラーをキャッチしてページにエラーメッセージを出してみる。

検証用VF↓

検証用Apexクラス↓

inputField, messageタグの方にはエラーメッセージは表示されず。

pagemessage

 

addError(ex)とaddMessages(ex)の2つのエラーメッセージが出力されているように見えるけど

DML Exceptionが発生した時点でSalesforceが自動的に

ApexPages.addMessages(ex)をやっているっぽく、addMessages消しても同じ出力結果に。

 

パターン5. <apex:inputField> + <apex:message > + immediate + action指定2

項目に直接addErrorしてみる。

検証用VF↓

検証用クラス↓

adderror_field

お、うまくいってる!と、思いきや、生成されたhtmlタグをよく見てみると…。

gakkari2

inputFieldのエラーメッセージは出力されているけど、

messageの方にはエラーメッセージが出力されてないorz

 

ということで、<apex:message>の利用方法がよくわからないっす…。

<apex:inputText>には使えないみたいだし。

 

対顧客用のフォーム画面を作成する場合には、エラーメッセージ用のプロパティを用意した方が懸命かもしれないっす。

”自前でやった方が早いし確実”っていうのはforce.comにはよくあることです!!w

IEでVisualforceページのjQueryのAjax処理が動かない

Visualforceページ内でActionFunction等のajax系のapexタグ・属性

(<apex:actionFunction>, <apex:commandButton reRender=””>等)を利用しつつ、

jQueryの$.ajaxを利用している場合に、IEで$.ajaxがうまく動かなくなってしまう。

 

これは、Apexのajax系処理をVFに実装して画面を表示すると

/faces/a4j/g/3_3_3.Finalorg.ajax4jsf.javascript.AjaxScript?rel=********** のURLで

Sarissa.js(http://dev.abiss.gr/sarissa/)というAjaxのライブラリが読み込まれてしまうためで、

IEでSarissa.jsが読み込まれると

ブラウザ組み込みのXMLHttpRequestオブジェクトがSarissa.jsによって上書きされてしまい

結果としてjQueryの$.ajaxが動かなくなってしまうことが原因。

 

対応策としては、

・Apexのajax系処理を使う場合はjQueryのAjax通信を行わない。

(どちらか片方に寄せる)

・下記のようにしてjQueryオブジェクトのxhrプロパティを書き換える。

の2パターン。

force.com内で完結するのであれば、JavaScript Remotingとかajax系タグだけでも問題ないが、

外部Webサービスとajaxを利用して連携する場合には注意が必要。

© 2017 freedom-man.com

Theme by Anders NorenUp ↑