Jenkins のログとメトリクスの収集
このページでは、Jenkins 用 Sumo Logic アプリケーションのログとメトリクス収集の設定手順を説明します。
収集の概要
Jenkins アプリケーションのログとメトリクスの収集を設定するには、次の作業を行います。
- Collector の設定
- HTTP ログとメトリクス Source の設定
- Jenkins プラグインのインストール
- Jenkins プラグインの設定
- 省略可能 - 高度な設定
ステップ 1: Collector の設定
新しい Sumo Logic の Hosted Collector を作成するには、Sumo Logic ドキュメントの「Hosted Collector を設定する」のセクションの手順を実行します。
ステップ 2: HTTP ログとメトリクス Source の設定
新しい HTTP ログとメトリクスの Source を作成するには、次の手順を実行します。
- 上記で作成した Hosted Collector で新しい HTTP ログとメトリクスの Source を作成するには、これらの手順に従ってください。
- [HTTP Source URL] と [Source Category] の値は、後で設定プロセスで必要になりますので、書き留めておいてください。
ステップ 3: Jenkins プラグインのインストール
このセクションでは、Jenkins プラグインをインストールする方法を順を追って説明します。
- Jenkins プラグインの更新—システムにインストールされている Jenkins プラグインを更新する場合は、この方法を使用してください。
- Sumologic パブリッシャを使用した初めてのインストール—Sumologic パブリッシャを初めて使用する場合は、この方法を使用してください。
- Jenkins プラグインの手動インストール—Jenkins プラグイン更新センター経由でのプラグインの直接インストールに制約がある場合は、この方法を使用してください。
Jenkins プラグインの更新
このセクションでは、システムにインストールされている Jenkins プラグインのバージョンを更新する方法を説明します。
Jenkins プラグインを更新するには、次の手順を実行します。
-
Jenkins コンソールで [Manage Jenkins (Jenkins の管理)] > [Manage Plugins (プラグインの管理)] に移動します。
-
[Updates (更新)] タブ > [Check now (今すぐ確認)] をクリックします。
-
[Sumologic Publisher (Sumologic パブリッシャ)] を選択します。
-
[Download now and install after restart (ダウンロードして再起動後にインストール)] をクリックします。通常、プラグインを表示するには、Jenkins を再起動する必要があります。
Sumologic パブリッシャを初めて使用したインストール
このセクションでは、Sumologic パブリッシャを初めて使用して Jenkins プラグインをインストールする方法を説明します。
初回のインストールを行うには、次の手順を実行します。
- Jenkins コンソールで [Manage Jenkins (Jenkins の管理)] > [Manage Plugins (プラグインの管理)] に移動します。
-
[Available (利用可能)] タブをクリックします。
-
「Sumologic Publisher (Sumologic パブリッシャ)」を見つけます。
-
[Sumologic Publisher (Sumologic パブリッシャ)] をクリックします。
- [Download now and install after restart (ダウンロードして再起動後にインストール)] をクリックします。通常、プラグインを表示するには、Jenkins を再起動する必要があります。
Jenkins プラグインの手動インストール
このセクションでは、Jenkins プラグインを手動でインストールする方法を説明します。
Jenkins プラグインをインストールするには、次の手順を実行します。
-
このリンクから Jenkins プラグイン HPI ファイルをダウンロードします。
-
Jenkins コンソールで [Manage Jenkins (Jenkins の管理)] > [Manage Plugins (プラグインの管理)] に移動します。
-
[Advanced (詳細)] > [Upload Plugin (プラグインのアップロード)] に移動して、[Choose File (ファイルの選択)] をクリックします。
- マシンにダウンロードした Sumologic-publisher.hpi ファイルを選択して、[Upload (アップロード)] をクリックします。
プラグインがインストールされると、次のようなページが表示されます。
- [Restart Jenkins when installation is complete and no jobs are running (インストールの完了後、ジョブが実行されていないときに Jenkins を再起動)] を選択します。通常、プラグインを表示するには、Jenkins を再起動する必要があります。
ステップ 4: Jenkins プラグインの設定
この作業では、Sumo Logic 用 Jenkins プラグインの設定を順を追って説明します。
Jenkins プラグインを設定するには、次の手順を実行します。
- [Jenkins] > [Manage Jenkins (Jenkins の管理)] に移動して、[Configure System (システムの設定)] を選択します。
- Sumo Logic Jenkins プラグインを探します。
- [Sumo Logic Jenkins Plugin (Sumo Logic Jenkins プラグイン)] ダイアログで以下を指定します。
- SumoLogic Portal Name (Sumo Logic ポータル名) - Hosted Collector のドメイン名です。例: service.sumologic.com または service.us2.sumologic.com
- Metric Data Prefix (メトリクス データ接頭辞): プラグインがインストールされている Jenkins マスタの名前を入力します。
- HTTP Source URL: ステップ 2 で書き留めた HTTP Source の URL。HTTP Source URL は次のようになります。
https://sumologic_url/receiver/v1/http/SECRET_STRING
- Source Category: Source 対して定義されている Source Category です。
- Keep Old Configuration for Jobs (ジョブの古い設定を残す): このオプションを有効にすると、ジョブの古い設定が送信されます。
- Sumo Logic に送信するデータのタイプを指定します。
- Metric Data (メトリクス データ) - メトリクス情報を送信します。
- Audit Logs (監査ログ) - ログイン、ログアウト、ログイン失敗、ジョブや Jenkins サーバの設定変更などの監査情報を送信します。
- Periodic Logs (周期ログ) - ノード情報、マスタ情報、シャットダウン イベント、Jenkins システム ログなどの周期的な情報を送信します。
- SCM logs (SCM ログ) - ビルドに関連した Source コントロール管理システムのログを送信します。
- 以下を指定します。
- Job Status Information (ジョブステータス情報): 選択すると、すべてのジョブのステータスが送信されます。
- Console Logs Information (コンソール ログ情報): 選択すると、すべてのジョブのコンソール ログが送信されます。
- [Apply (適用)] をクリックして、[Save (保存)] をクリックします。
ステップ 5: 省略可能 - 高度な設定
このセクションでは、Jenkins の設定をコードとして使用するプロジェクト用に Sumo Logic Jenkins プラグインの設定方法を説明します。詳細については、「コードとしての設定」を参照してください。
Jenkins の設定をコードとして使用するプロジェクト用に Sumo Logic Jenkins プラグインを設定するには、次の手順を実行します。
- プラグインは、このドキュメントに記載されているように、Jenkins が提供するコードとしての設定を使用して設定できます。
- 特定のジョブの場合は、次の手順を実行します。
- フリースタイルおよび Maven プロジェクトの場合は、[Job Configuration (ジョブの設定)] に移動し、[Post Build Actions (ポスト ビルド アクション)] で [Sumo Logic Build Logger (Sumo Logic ビルド ロガー)] を選択します。
- パイプライン プロジェクトの場合は、次の手順を実行します。
- パイプラインの設定で、通常のスクリプトに対して以下を最上位レベルにします。
SumoPipelineLogCollection { // your script
- そしてパイプライン設定で、宣言型パイプライン スクリプトのオプションを更新します。
options { SumoPipelineLogCollection() }
- [Apply (適用)] をクリックして、[Save (保存)] をクリックします。
FER (Field Extraction Rules) のログ
Jenkins アプリケーションで使用するログ形式の FER (Field Extraction Rules) を次の表に示します。
監査ログ
監査イベント タイプ |
FER (Field Extraction Rules) |
User_Login User_Logout User_Login_Failure |
Audit_Event (User_Login OR User_Logout OR User_Login_Failure) | json "userName", "auditEventType", "userId", "message", "eventTime", "logType" as User_Name, Audit_Event, User_Id, Message, Event_Time, Log_Type nodrop |
Job_Started |
Audit_Event (Job_Started) | json "userName", "auditEventType", "userId", "message", "eventTime", "logType" as User_Name, Audit_Event, User_Id, Message, Event_Time, Log_Type nodrop | parse field=Message "User * started the job * with build number as *." as User, Job_Name, Build_Number |
Job_Aborted |
Audit_Event (Job_Aborted) | json "userName", "auditEventType", "userId", "message", "eventTime", "logType" as User_Name, Audit_Event, User_Id, Message, Event_Time, Log_Type nodrop | parse field=Message "User * aborted the job * with build number as *." as User, Job_Name, Build_Number |
Job_Finished |
Audit_Event (Job_Finished) | json "userName", "auditEventType", "userId", "message", "eventTime", "logType" as User_Name, Audit_Event, User_Id, Message, Event_Time, Log_Type nodrop | parse field=Message "Job * with build number as * finished with status as *" as Job_Name, Build_Number, Status |
作成 Deleted Updated |
Audit_Event (Created OR Deleted OR Updated) | json "userName", "auditEventType", "userId", "message", "eventTime", "logType" as User_Name, Audit_Event, User_Id, Message, Event_Time, Log_Type nodrop | parse field=Message "* * the item *" as User, Event, Item_Name |
Copied |
Audit_Event (Copied) | json "userName", "auditEventType", "userId", "message", "eventTime", "logType" as User_Name, Audit_Event, User_Id, Message, Event_Time, Log_Type nodrop | parse field=Message "* copied the item * from *" as User, New_Item_Name, Copied_From |
Location_Changed |
Audit_Event (Location_Changed) | json "userName", "auditEventType", "userId", "message", "eventTime", "logType" as User_Name, Audit_Event, User_Id, Message, Event_Time, Log_Type nodrop | parse field=Message "* changed the location of the item * to *" as User, Old_Location, New_Location |
Config_Change |
Audit_Event (Config_Change) | json "userName", "auditEventType", "userId", "message", "eventTime", "logType", "fileDetails.Old_File_Data", "fileDetails.Current_File_Data" as User_Name, Audit_Event, User_Id, Message, Event_Time, Log_Type, Old_File_Data, Current_File_Data nodrop | parse field=Message "file *" as File_Name | base64Decode(Current_File_Data) as Current_File_Data | base64Decode(Old_File_Data) as Old_File_Data |
周期ログ
周期ログ イベント |
FER (Field Extraction Rules) |
Shutdown |
Slave_Event Shutdown | json "logType", "eventTime", "eventSource" as Log_Type, Event_Time, Event_Source |
Jenkins_Log |
Jenkins_Log | json "threadId", "logType", "logLevel", "logMessage", "logSource", "eventTime", "logStackTrace" as Thread_ID, Log_Type, Log_Level, Log_Message, Log_Source, Event_Time, Log_Stack_Trace nodrop |
Computer_Online Computer_Offline Computer_Temp_Online Computer_Temp_Offline Launch_Failure |
("Computer_Online" OR "Computer_Offline" OR "Computer_Temp_Online" OR "Computer_Temp_Offline" OR "Launch_Failure") | json "nodeName", "eventSource", "eventTime", "nodeLabel", "numberOfExecutors", "nodeURL" as Node_Name, Event_Type, Event_Time, Node_Label, Executors, Node_URL nodrop |
Periodic_Update |
Periodic_Update "nodeStatus":"updated" | json "nodeName", "monitorData.ArchitectureMonitor", "monitorData.ClockMonitor" ,"monitorData.ResponseTimeMonitor", "monitorData.DiskSpaceMonitor", "monitorData.TemporarySpaceMonitor", "monitorData.SwapSpaceMonitor", "isIdle", "isOnline", "nodeURL", "nodeLabel", "eventTime" as Node_Name, Architecture, Clock, Reponse_Time, Disk_Space, Temporary_Space, SwapMemory, Idle, Online, URL, Node_Label, Event_Time nodrop | parse field=SwapMemory "Memory:* Swap:*" as Physical_Memory, Swap_Memory |
Node_Removed |
Periodic_Update "nodeStatus":"removed" | json "eventTime", "nodeName", "numberOfExecutors" as Event_Time, Node_Name, ExecutorsCount nodrop |
キュー内のジョブ |
Queue_Event | json "queueId", "queueTime", "isBlocked", "reasonForBlock", "isConcurrentBuild", "jobName", "jobURL" as Queue_Id, Queue_Time, Blocked, Block_Reason, Concurrent_Build, Job_Name, Job_URL nodrop |
進行中のジョブ |
In_Progress | json "name", "result", "number", "jobBuildURL", "label", "nodeName", "jobStartTime", "jobRunDuration" as Job_Name, Result, Job_Number, Job_URL, Job_Label, Node_Name, Job_Start_Time, Job_Run_Duration nodrop |
SCM ログ
SCM ログ タイプ |
FER (Field Extraction Rules) |
SCM ステータス |
Scm_Status | json "jobName", "buildNumber", "scmURLs", "branches", "scmType", "revision", "changeLog" as Job_Name, Build_Number, SCM_URLs, Branches, SCM_Type, Revision, Change_Log nodrop |
Job ステータス ログ
Job ステータス タイプ |
FER (Field Extraction Rules) |
ジョブ ステータス |
Job_Status | json "name", "hudsonVersion", "result", "description", "number", "user", "jobStartTime", "jobType", "jobRunDuration", "jobBuildURL", "upstreamJobURL", "triggerCauses", "label","nodeName", "testResult"nodrop |
テスト結果 |
Test_Result | json "logType", "number", "name", "testResult" nodrop | parse regex field=testResult "(?<TestResult>\{[^\}]+\})" multi | json field=TestResult "className", "testName", "status", "duration", "errorDetails", "errorStackTrace" nodrop |
パイプライン ステージ |
Pipeline_Stages | json "logType", "number", "name", "stages" nodrop | parse regex field = stages "(?<Stage>\{[^\}]+(?:\}\}|\}))" multi | json field=Stage "id", "name", "startTime", "duration", "status", "steps", "error" nodrop |
ジョブ コンソール ログ
ジョブ名、ビルド番号、ステージ名は、# で区切られて Source の [Name (名前)] に入力されます (例: MyTest#1#Initialize)。
ジョブ コンソール ログ タイプ |
FER (Field Extraction Rules) |
コンソール ログ |
parse "[*] *" as Log_Time, Log_Message |
ログ メッセージのサンプル
ログ タイプごとのログ メッセージの例を次の表に示します。
ログ タイプ |
例 |
認証 |
{ "userName": "Sourabh Jain", "auditEventType": "User_Login", "userId": "sourabh", "message": "sourabh Logged in.", "logType": "Audit_Event", "eventTime": "2019-06-06 05:55:38,609 +00:00" } |
設定の変更 |
{ "userName": "demoexample@sumologic.com", "auditEventType": "Config_Change", "userId": "demoexample@sumologic.com", "message": "demoexample@sumologic.com changed configuration for the file jobs/demoexample-gradle-dep-check/config.xml.", "fileDetails": { "Old_File_Data": "PD94bWwgdmVyc2lvbj0nMS4xJyBlbmNvZGluZz0nVVRGLTgnPz4KPGZsb3ctZGVmaW5pdGlvbiBwbHVnaW49IndvcmtmbG93LWpvYkAyLjMyIj4KICA8YWN0aW9ucz4KICAgIDxvcmcuamVua2luc2NpLnBsdWdpbnMucGlwZWxpbmUubW9kZWxkZWZpbml0aW9uLmFjdGlvbnMuRGVjbGFyYXRpdmVKb2DwvYXV0aFRva2VuPgogIDxkaXNhYmxlZD5mYWxzZTwvZGlzYWJsZWQ+demoexamplefile==", "Current_File_Data": "PD94bWwgdmVyc2lvbj0nMS4xJyBlbmNvZGluZz0nVVRGLTgnPz4KPGZsb3ctZGVmaW5pdGlvbiBwbHVnaW49IndvcmtmbG93LWpvYkAyLjMyIj4KICA8YWN0aW9ucz4KICAgIDxvcmcuamVua2luc2NpLnBsdWdpbnMucGlwZWxpbmUubW9kZWxkZWZpbml0aW9uLmFjdGlvbnMuRGVjbGFyYXRpdnZ2Vycy8+CiAgPGF1dGhUb2tlbj5zd29yZGZpc2g8L2F1dGhUb2tlbj4KICA8ZGlzYWJsZWQ+ZmFsc2U8L2Rpc2FibGVkdemoexamplefile=" }, "logType": "Audit_Event", "eventTime": "2019-06-05 15:17:28,237 +00:00" } |
Shutdown |
{ "logType": "Slave_Event", "eventTime": "2019-06-05 11:00:12,256 +00:00", "eventSource": "Shutdown" } |
Jenkins ログ |
{ "threadId": 33675, "logType": "Jenkins_Log", "logLevel": "INFO", "logMessage": "Finished Sumo Logic Periodic Data Publisher. 102 ms", "logSource": "com.sumologic.jenkins.jenkinssumologicplugin.sender.SumoPeriodicPublisher", "eventTime": "2019-06-06 07:08:06,908 +00:00" } |
定期更新 |
{ "numberOfSlaves": 0, "numberOfExecutors": 4, "numberOfFreeExecutors": 2, "nodeName": "build-jenkins-executor (i-07e3500c4cda1f30b)", "nodeLabel": "gradle docker", "nodeStatus": "updated", "isIdle": false, "isOnline": true, "isRemoved": false, "isConnecting": false, "nodeURL": "https://localhost:8080/computer/buil...00c4cda1f30b)/", "eventSource": "Periodic_Update", "monitorData": { "SwapSpaceMonitor": "Memory:48519/63624MB Swap:0/0MB", "ClockMonitor": "In sync", "DiskSpaceMonitor": "85.71 GB", "ResponseTimeMonitor": "13ms", "ArchitectureMonitor": "Linux (amd64)", "TemporarySpaceMonitor": "85.71 GB" }, "logType": "Slave_Event", "eventTime": "2019-06-06 07:05:06,702 +00:00" } |
キュー内 |
{ "numItemsInQueue": 0, "numBlockedItemsInQueue": 0, "maxWaitingTime": 0, "averageWaitingTime": 0, "queueId": 3060904, "queueTime": 56.093, "isBlocked": true, "reasonForBlock": "All nodes of label ‘docker’ are offline", "isConcurrentBuild": false, "jobName": "part of Module ITs: vault #142", "jobURL": "https://localhost:8080/job/module-it-vault/142/", "logType": "Queue_Event", "eventTime": "2019-06-06 06:50:06,668 +00:00" } |
進行中 |
{ "name": "TestComplexPipeline", "result": "In_Progress", "number": 11, "start_time": 0, "duration": 0, "jobStartTime": "2019-06-04 03:39:57,790 +00:00", "jobRunDuration": 13.175, "jobBuildURL": "http://localhost:8080/job/TestComplexPipeline/11/", "label": "Master", "nodeName": "master" } |
SCM ログ |
{ "buildNumber": 3, "jobName": "master", "scmType": "hudson.plugins.git.GitSCM", "scmURLs": "git https://github.com/SumoSourabh/build...ne-project.git", "revision": "7bb6c1d7b1e3d7d65a39bade4f2ad68196322b2c", "branches": "master ", "changeLog": [ "1559619601000 commit:aa058c84927345885838c17bb7db448910885c6b author:Sourabh Jain message:commit", "1559621063000 commit:7bb6c1d7b1e3d7d65a39bade4f2ad68196322b2c author:Sourabh Jain message:commit" ], "logType": "Scm_Status", "eventTime": "2019-06-04 04:05:15,723 +00:00" } |
Job ステータス ログ |
{ "name": "MyTest", "hudsonVersion": "2.174", "result": "UNSTABLE", "description": "This is a testPlease . alsncns", "number": 35, "start_time": 1560239332099, "duration": 17401, "logType": "Job_Status", "user": "sourabh", "jobStartTime": "2019-06-11 07:48:52,096 +00:00", "jobType": "Maven project", "jobRunDuration": 17.401, "jobBuildURL": "http://ec2-13-234-181-219.ap-south-1...job/MyTest/35/", "upstreamJobURL": "", "triggerCauses": "Started by user Sourabh Jain", "label": "Master", "nodeName": "master", "jobMetaData": { "NODES": "1,2,3", "ENV": "qa", "APPS": "app01,app02" }, "testResult": { "failures": 24, "passes": 238, "skips": 59, "total": 321, "totalDuration": 0.10700000333599746 } } |
コンソール ログ |
[2019-06-04 09:02:37,386 +00:00] channel stopped |
テスト結果 |
{ "logType": "Test_Result", "number": 35, "name": "MyTest", "testResult": [ { "className": "TwentyTwoTest", "testName": "test4", "errorStackTrace": "java.lang.AssertionError: oops\n\tat org.junit.Assert.fail(Assert.java:88)\n\tat Base.BaseTestClassMethod(Base.java:14)\n\tat TwentyTwoTest.test4(TwentyTwoTest.java:21)\n", "errorDetails": "oops", "status": "Failed", "duration": 0 }, { "className": "TwentyTwoTest", "testName": "test5", "status": "Passed", "duration": 0 } ] } |
パイプライン ステージ |
{ "logType": "Pipeline_Stages", "number": 23, "name": "TestComplexPipeline", "stages": [ { "id": 1, "stageId": "10", "name": "parallel stage", "status": "SUCCESS", "startTime": "2019-06-11 07:55:50,240 +00:00", "duration": 0.174, "pauseDuration": 0 }, { "id": 2, "stageId": "14", "name": "build", "status": "SUCCESS", "startTime": "2019-06-11 07:55:50,414 +00:00", "duration": 0.056, "pauseDuration": 0, "steps": [ "StepName - Print Message,StepStatus - SUCCESS,StepDuration - 0.005,StepArguments - Building the app [app01] on node [1],StepExecutedOn - (master)" ] }, { "id": 3, "stageId": "19", "name": "deploy", "status": "SUCCESS", "startTime": "2019-06-11 07:55:50,492 +00:00", "duration": 0.052, "pauseDuration": 0, "steps": [ "StepName - Print Message,StepStatus - SUCCESS,StepDuration - 0.005,StepArguments - Deploying the app app01] on node [1],StepExecutedOn - (master)" ] } ] } |
クエリのサンプル
このクエリ例は、[Jenkins - Job Overview (Jenkins - ジョブの概要)] ダッシュボードの [Jobs in Progress (進行中のジョブ)] パネルから引用されています。
_sourceCategory=Labs/Jenkins/Sourabh/Logs In_Progress | json "name", "result", "number" as Job_Name, Result, Job_Number | where Result = "In_Progress" | first(_raw) by Job_Name, Job_Number | json field=_first "jobBuildURL", "label", "nodeName", "jobStartTime", "jobRunDuration" as Job_URL, Job_Label, Node_Name, Job_Start_Time, Job_Run_Duration nodrop | where ![subquery : _sourceCategory=Labs/Jenkins/Sourabh/Logs Job_Status | json "name", "number" as Job_Name, Job_Number | count by Job_Name, Job_Number | compose Job_Number, Job_Name] | tourl(Job_URL, Job_Name) as Job_URL | count by Job_Name, Job_URL, Job_Label, Node_Name, Job_Start_Time, Job_Run_Duration, Job_Number | fields Job_Name, Job_URL, Job_Label, Node_Name, Job_Start_Time, Job_Run_Duration, Job_Number