diff --git a/plugins/inputs/webhooks/github/README.md b/plugins/inputs/webhooks/github/README.md index 53adae92a..64986c8fc 100644 --- a/plugins/inputs/webhooks/github/README.md +++ b/plugins/inputs/webhooks/github/README.md @@ -28,7 +28,7 @@ The format is as follows: The tag values and field values show the place on the incoming JSON object where the data is sourced from. -### [`commit_comment` event](https://developer.github.com/v3/activity/events/types/#commitcommentevent) +### [`commit_comment` event](https://docs.github.com/en/webhooks/webhook-events-and-payloads#commit_comment) **Tags:** @@ -46,7 +46,7 @@ where the data is sourced from. * 'commit' = `event.comment.commit_id` string * 'comment' = `event.comment.body` string -### [`create` event](https://developer.github.com/v3/activity/events/types/#createevent) +### [`create` event](https://docs.github.com/en/webhooks/webhook-events-and-payloads#create) **Tags:** @@ -64,7 +64,7 @@ where the data is sourced from. * 'ref' = `event.ref` string * 'refType' = `event.ref_type` string -### [`delete` event](https://developer.github.com/v3/activity/events/types/#deleteevent) +### [`delete` event](https://docs.github.com/en/webhooks/webhook-events-and-payloads#delete) **Tags:** @@ -82,7 +82,7 @@ where the data is sourced from. * 'ref' = `event.ref` string * 'refType' = `event.ref_type` string -### [`deployment` event](https://developer.github.com/v3/activity/events/types/#deploymentevent) +### [`deployment` event](https://docs.github.com/en/webhooks/webhook-events-and-payloads#deployment) **Tags:** @@ -102,7 +102,7 @@ where the data is sourced from. * 'environment' = `event.deployment.environment` string * 'description' = `event.deployment.description` string -### [`deployment_status` event](https://developer.github.com/v3/activity/events/types/#deploymentstatusevent) +### [`deployment_status` event](https://docs.github.com/en/webhooks/webhook-events-and-payloads#deployment_status) **Tags:** @@ -124,7 +124,7 @@ where the data is sourced from. * 'depState' = `event.deployment_status.state` string * 'depDescription' = `event.deployment_status.description` string -### [`fork` event](https://developer.github.com/v3/activity/events/types/#forkevent) +### [`fork` event](https://docs.github.com/en/webhooks/webhook-events-and-payloads#fork) **Tags:** @@ -141,7 +141,7 @@ where the data is sourced from. * 'issues' = `event.repository.open_issues_count` int * 'forkee' = `event.forkee.repository` string -### [`gollum` event](https://developer.github.com/v3/activity/events/types/#gollumevent) +### [`gollum` event](https://docs.github.com/en/webhooks/webhook-events-and-payloads#gollum) **Tags:** @@ -157,7 +157,7 @@ where the data is sourced from. * 'forks' = `event.repository.forks_count` int * 'issues' = `event.repository.open_issues_count` int -### [`issue_comment` event](https://developer.github.com/v3/activity/events/types/#issuecommentevent) +### [`issue_comment` event](https://docs.github.com/en/webhooks/webhook-events-and-payloads#issue_comment) **Tags:** @@ -177,7 +177,7 @@ where the data is sourced from. * 'comments' = `event.issue.comments` int * 'body' = `event.comment.body` string -### [`issues` event](https://developer.github.com/v3/activity/events/types/#issuesevent) +### [`issues` event](https://docs.github.com/en/webhooks/webhook-events-and-payloads#issues) **Tags:** @@ -197,7 +197,7 @@ where the data is sourced from. * 'title' = `event.issue.title` string * 'comments' = `event.issue.comments` int -### [`member` event](https://developer.github.com/v3/activity/events/types/#memberevent) +### [`member` event](https://docs.github.com/en/webhooks/webhook-events-and-payloads#member) **Tags:** @@ -215,7 +215,7 @@ where the data is sourced from. * 'newMember' = `event.sender.login` string * 'newMemberStatus' = `event.sender.site_admin` bool -### [`membership` event](https://developer.github.com/v3/activity/events/types/#membershipevent) +### [`membership` event](https://docs.github.com/en/webhooks/webhook-events-and-payloads#membership) **Tags:** @@ -229,7 +229,7 @@ where the data is sourced from. * 'newMember' = `event.sender.login` string * 'newMemberStatus' = `event.sender.site_admin` bool -### [`page_build` event](https://developer.github.com/v3/activity/events/types/#pagebuildevent) +### [`page_build` event](https://docs.github.com/en/webhooks/webhook-events-and-payloads#page_build) **Tags:** @@ -245,7 +245,7 @@ where the data is sourced from. * 'forks' = `event.repository.forks_count` int * 'issues' = `event.repository.open_issues_count` int -### [`public` event](https://developer.github.com/v3/activity/events/types/#publicevent) +### [`public` event](https://docs.github.com/en/webhooks/webhook-events-and-payloads#public) **Tags:** @@ -261,7 +261,7 @@ where the data is sourced from. * 'forks' = `event.repository.forks_count` int * 'issues' = `event.repository.open_issues_count` int -### [`pull_request_review_comment` event](https://developer.github.com/v3/activity/events/types/#pullrequestreviewcommentevent) +### [`pull_request_review_comment` event](https://docs.github.com/en/webhooks/webhook-events-and-payloads#pull_request_review_comment) **Tags:** @@ -288,7 +288,7 @@ where the data is sourced from. * 'commentFile' = `event.comment.file` string * 'comment' = `event.comment.body` string -### [`pull_request` event](https://developer.github.com/v3/activity/events/types/#pullrequestevent) +### [`pull_request` event](https://docs.github.com/en/webhooks/webhook-events-and-payloads#pull_request) **Tags:** @@ -313,7 +313,7 @@ where the data is sourced from. * 'deletions' = `event.pull_request.deletions` int * 'changedFiles' = `event.pull_request.changed_files` int -### [`push` event](https://developer.github.com/v3/activity/events/types/#pushevent) +### [`push` event](https://docs.github.com/en/webhooks/webhook-events-and-payloads#push) **Tags:** @@ -332,7 +332,7 @@ where the data is sourced from. * 'before' = `event.before` string * 'after' = `event.after` string -### [`repository` event](https://developer.github.com/v3/activity/events/types/#repositoryevent) +### [`repository` event](https://docs.github.com/en/webhooks/webhook-events-and-payloads#repository) **Tags:** @@ -348,7 +348,7 @@ where the data is sourced from. * 'forks' = `event.repository.forks_count` int * 'issues' = `event.repository.open_issues_count` int -### [`release` event](https://developer.github.com/v3/activity/events/types/#releaseevent) +### [`release` event](https://docs.github.com/en/webhooks/webhook-events-and-payloads#release) **Tags:** @@ -365,7 +365,7 @@ where the data is sourced from. * 'issues' = `event.repository.open_issues_count` int * 'tagName' = `event.release.tag_name` string -### [`status` event](https://developer.github.com/v3/activity/events/types/#statusevent) +### [`status` event](https://docs.github.com/en/webhooks/webhook-events-and-payloads#status) **Tags:** @@ -383,7 +383,7 @@ where the data is sourced from. * 'commit' = `event.sha` string * 'state' = `event.state` string -### [`team_add` event](https://developer.github.com/v3/activity/events/types/#teamaddevent) +### [`team_add` event](https://docs.github.com/en/webhooks/webhook-events-and-payloads#team_add) **Tags:** @@ -400,7 +400,7 @@ where the data is sourced from. * 'issues' = `event.repository.open_issues_count` int * 'teamName' = `event.team.name` string -### [`watch` event](https://developer.github.com/v3/activity/events/types/#watchevent) +### [`watch` event](https://docs.github.com/en/webhooks/webhook-events-and-payloads#watch) **Tags:** @@ -415,3 +415,42 @@ where the data is sourced from. * 'stars' = `event.repository.stargazers_count` int * 'forks' = `event.repository.forks_count` int * 'issues' = `event.repository.open_issues_count` int + +### [`workflow_job` event](https://docs.github.com/en/webhooks/webhook-events-and-payloads#workflow_job) + +**Tags:** + +* 'event' = `headers[X-Github-Event]` string +* 'action' = `event.action` string +* 'repository' = `event.repository.full_name` string +* 'private' = `event.repository.private` bool +* 'user' = `event.sender.login` string +* 'admin' = `event.sender.site_admin` bool +* 'name' = `event.workflow_job.name` string +* 'conclusion' = `event.workflow_job.conclusion` string + +**Fields:** + +* 'run_attempt' = `event.workflow_job.run_attempt` int +* 'queue_time' = `event.workflow_job.started_at - event.workflow_job.created_at at event.action = in_progress in milliseconds` int +* 'run_time' = `event.workflow_job.completed_at - event.workflow_job.started_at at event.action = completed in milliseconds` int +* 'head_branch' = `event.workflow_job.head_branch` string + +### [`workflow_run` event](https://docs.github.com/en/webhooks/webhook-events-and-payloads#workflow_run) + +**Tags:** + +* 'event' = `headers[X-Github-Event]` string +* 'action' = `event.action` string +* 'repository' = `event.repository.full_name` string +* 'private' = `event.repository.private` bool +* 'user' = `event.sender.login` string +* 'admin' = `event.sender.site_admin` bool +* 'name' = `event.workflow_run.name` string +* 'conclusion' = `event.workflow_run.conclusion` string + +**Fields:** + +* 'run_attempt' = `event.workflow_run.run_attempt` int +* 'run_time' = `event.workflow_run.completed_at - event.workflow_run.run_started_at at event.action = completed in milliseconds` int +* 'head_branch' = `event.workflow_run.head_branch` string diff --git a/plugins/inputs/webhooks/github/github_webhooks.go b/plugins/inputs/webhooks/github/github_webhooks.go index 0f435b92e..a23d77baa 100644 --- a/plugins/inputs/webhooks/github/github_webhooks.go +++ b/plugins/inputs/webhooks/github/github_webhooks.go @@ -128,6 +128,10 @@ func (gh *Webhook) newEvent(data []byte, name string) (event, error) { return generateEvent(data, &teamAddEvent{}) case "watch": return generateEvent(data, &watchEvent{}) + case "workflow_job": + return generateEvent(data, &workflowJobEvent{}) + case "workflow_run": + return generateEvent(data, &workflowRunEvent{}) } return nil, &newEventError{"Not a recognized event type"} } diff --git a/plugins/inputs/webhooks/github/github_webhooks_mock_json_test.go b/plugins/inputs/webhooks/github/github_webhooks_mock_json_test.go index 4a8a0174e..b3d111585 100644 --- a/plugins/inputs/webhooks/github/github_webhooks_mock_json_test.go +++ b/plugins/inputs/webhooks/github/github_webhooks_mock_json_test.go @@ -3026,3 +3026,547 @@ func watchEventJSON() string { } }` } + +func WorkflowJobJSON() string { + return `{ + "action": "completed", + "workflow_job": { + "id": 34960636490, + "run_id": 12537003369, + "workflow_name": ".NET", + "head_branch": "feature/test", + "run_url": "https://api.github.com/repos/DeusDeorum1/yhome-controller/actions/runs/12537003369", + "run_attempt": 1, + "node_id": "CR_kwDONd0bVc8AAAAII9D6Sg", + "head_sha": "2c4f2526866d85e29bd7caea0791d861a0c713aa", + "url": "https://api.github.com/repos/DeusDeorum1/yhome-controller/actions/jobs/34960636490", + "html_url": "https://github.com/DeusDeorum1/yhome-controller/actions/runs/12537003369/job/34960636490", + "status": "completed", + "conclusion": "success", + "created_at": "2024-12-29T16:28:44Z", + "started_at": "2024-12-29T16:28:50Z", + "completed_at": "2024-12-29T16:29:17Z", + "name": "Run build", + "steps": [ + { + "name": "Set up job", + "status": "completed", + "conclusion": "success", + "number": 1, + "started_at": "2024-12-29T16:28:49Z", + "completed_at": "2024-12-29T16:28:50Z" + }, + { + "name": "Checkout", + "status": "completed", + "conclusion": "success", + "number": 2, + "started_at": "2024-12-29T16:28:50Z", + "completed_at": "2024-12-29T16:28:51Z" + } + ], + "check_run_url": "https://api.github.com/repos/DeusDeorum1/yhome-controller/check-runs/34960636490", + "labels": [ + "ubuntu-latest" + ], + "runner_id": 3, + "runner_name": "GitHub Actions 3", + "runner_group_id": 2, + "runner_group_name": "GitHub Actions" + }, + "repository": { + "id": 903682901, + "node_id": "R_kgDONd0bVQ", + "name": "yhome-controller", + "full_name": "DeusDeorum1/yhome-controller", + "private": true, + "owner": { + "login": "DeusDeorum1", + "id": 23059354, + "node_id": "MDQ6VXNlcjIzMDU5MzU0", + "avatar_url": "https://avatars.githubusercontent.com/u/23059354?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/DeusDeorum1", + "html_url": "https://github.com/DeusDeorum1", + "followers_url": "https://api.github.com/users/DeusDeorum1/followers", + "following_url": "https://api.github.com/users/DeusDeorum1/following{/other_user}", + "gists_url": "https://api.github.com/users/DeusDeorum1/gists{/gist_id}", + "starred_url": "https://api.github.com/users/DeusDeorum1/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/DeusDeorum1/subscriptions", + "organizations_url": "https://api.github.com/users/DeusDeorum1/orgs", + "repos_url": "https://api.github.com/users/DeusDeorum1/repos", + "events_url": "https://api.github.com/users/DeusDeorum1/events{/privacy}", + "received_events_url": "https://api.github.com/users/DeusDeorum1/received_events", + "type": "User", + "user_view_type": "public", + "site_admin": false + }, + "html_url": "https://github.com/DeusDeorum1/yhome-controller", + "description": null, + "fork": false, + "url": "https://api.github.com/repos/DeusDeorum1/yhome-controller", + "forks_url": "https://api.github.com/repos/DeusDeorum1/yhome-controller/forks", + "keys_url": "https://api.github.com/repos/DeusDeorum1/yhome-controller/keys{/key_id}", + "collaborators_url": "https://api.github.com/repos/DeusDeorum1/yhome-controller/collaborators{/collaborator}", + "teams_url": "https://api.github.com/repos/DeusDeorum1/yhome-controller/teams", + "hooks_url": "https://api.github.com/repos/DeusDeorum1/yhome-controller/hooks", + "issue_events_url": "https://api.github.com/repos/DeusDeorum1/yhome-controller/issues/events{/number}", + "events_url": "https://api.github.com/repos/DeusDeorum1/yhome-controller/events", + "assignees_url": "https://api.github.com/repos/DeusDeorum1/yhome-controller/assignees{/user}", + "branches_url": "https://api.github.com/repos/DeusDeorum1/yhome-controller/branches{/branch}", + "tags_url": "https://api.github.com/repos/DeusDeorum1/yhome-controller/tags", + "blobs_url": "https://api.github.com/repos/DeusDeorum1/yhome-controller/git/blobs{/sha}", + "git_tags_url": "https://api.github.com/repos/DeusDeorum1/yhome-controller/git/tags{/sha}", + "git_refs_url": "https://api.github.com/repos/DeusDeorum1/yhome-controller/git/refs{/sha}", + "trees_url": "https://api.github.com/repos/DeusDeorum1/yhome-controller/git/trees{/sha}", + "statuses_url": "https://api.github.com/repos/DeusDeorum1/yhome-controller/statuses/{sha}", + "languages_url": "https://api.github.com/repos/DeusDeorum1/yhome-controller/languages", + "stargazers_url": "https://api.github.com/repos/DeusDeorum1/yhome-controller/stargazers", + "contributors_url": "https://api.github.com/repos/DeusDeorum1/yhome-controller/contributors", + "subscribers_url": "https://api.github.com/repos/DeusDeorum1/yhome-controller/subscribers", + "subscription_url": "https://api.github.com/repos/DeusDeorum1/yhome-controller/subscription", + "commits_url": "https://api.github.com/repos/DeusDeorum1/yhome-controller/commits{/sha}", + "git_commits_url": "https://api.github.com/repos/DeusDeorum1/yhome-controller/git/commits{/sha}", + "comments_url": "https://api.github.com/repos/DeusDeorum1/yhome-controller/comments{/number}", + "issue_comment_url": "https://api.github.com/repos/DeusDeorum1/yhome-controller/issues/comments{/number}", + "contents_url": "https://api.github.com/repos/DeusDeorum1/yhome-controller/contents/{+path}", + "compare_url": "https://api.github.com/repos/DeusDeorum1/yhome-controller/compare/{base}...{head}", + "merges_url": "https://api.github.com/repos/DeusDeorum1/yhome-controller/merges", + "archive_url": "https://api.github.com/repos/DeusDeorum1/yhome-controller/{archive_format}{/ref}", + "downloads_url": "https://api.github.com/repos/DeusDeorum1/yhome-controller/downloads", + "issues_url": "https://api.github.com/repos/DeusDeorum1/yhome-controller/issues{/number}", + "pulls_url": "https://api.github.com/repos/DeusDeorum1/yhome-controller/pulls{/number}", + "milestones_url": "https://api.github.com/repos/DeusDeorum1/yhome-controller/milestones{/number}", + "notifications_url": "https://api.github.com/repos/DeusDeorum1/yhome-controller/notifications{?since,all,participating}", + "labels_url": "https://api.github.com/repos/DeusDeorum1/yhome-controller/labels{/name}", + "releases_url": "https://api.github.com/repos/DeusDeorum1/yhome-controller/releases{/id}", + "deployments_url": "https://api.github.com/repos/DeusDeorum1/yhome-controller/deployments", + "created_at": "2024-12-15T09:23:35Z", + "updated_at": "2024-12-22T14:25:20Z", + "pushed_at": "2024-12-29T16:28:40Z", + "git_url": "git://github.com/DeusDeorum1/yhome-controller.git", + "ssh_url": "git@github.com:DeusDeorum1/yhome-controller.git", + "clone_url": "https://github.com/DeusDeorum1/yhome-controller.git", + "svn_url": "https://github.com/DeusDeorum1/yhome-controller", + "homepage": null, + "size": 813, + "stargazers_count": 0, + "watchers_count": 0, + "language": "C#", + "has_issues": true, + "has_projects": true, + "has_downloads": true, + "has_wiki": false, + "has_pages": false, + "has_discussions": false, + "forks_count": 0, + "mirror_url": null, + "archived": false, + "disabled": false, + "open_issues_count": 0, + "license": null, + "allow_forking": true, + "is_template": false, + "web_commit_signoff_required": false, + "topics": [ + + ], + "visibility": "private", + "forks": 0, + "open_issues": 0, + "watchers": 0, + "default_branch": "develop" + }, + "sender": { + "login": "DeusDeorum1", + "id": 23059354, + "node_id": "MDQ6VXNlcjIzMDU5MzU0", + "avatar_url": "https://avatars.githubusercontent.com/u/23059354?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/DeusDeorum1", + "html_url": "https://github.com/DeusDeorum1", + "followers_url": "https://api.github.com/users/DeusDeorum1/followers", + "following_url": "https://api.github.com/users/DeusDeorum1/following{/other_user}", + "gists_url": "https://api.github.com/users/DeusDeorum1/gists{/gist_id}", + "starred_url": "https://api.github.com/users/DeusDeorum1/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/DeusDeorum1/subscriptions", + "organizations_url": "https://api.github.com/users/DeusDeorum1/orgs", + "repos_url": "https://api.github.com/users/DeusDeorum1/repos", + "events_url": "https://api.github.com/users/DeusDeorum1/events{/privacy}", + "received_events_url": "https://api.github.com/users/DeusDeorum1/received_events", + "type": "User", + "user_view_type": "public", + "site_admin": false + } +}` +} + +func WorkflowRunJSON() string { + return `{ + "action": "completed", + "workflow_run": { + "id": 12537003369, + "name": ".NET", + "node_id": "WFR_kwLONd0bVc8AAAAC60N9aQ", + "head_branch": "feature/test", + "head_sha": "2c4f2526866d85e29bd7caea0791d861a0c713aa", + "path": ".github/workflows/dotnet.yml", + "display_title": "fix step name (#15)", + "run_number": 52, + "event": "push", + "status": "completed", + "conclusion": "success", + "workflow_id": 133367596, + "check_suite_id": 32519948712, + "check_suite_node_id": "CS_kwDONd0bVc8AAAAHklcJqA", + "url": "https://api.github.com/repos/DeusDeorum1/yhome-controller/actions/runs/12537003369", + "html_url": "https://github.com/DeusDeorum1/yhome-controller/actions/runs/12537003369", + "pull_requests": [ + + ], + "created_at": "2024-12-29T16:28:42Z", + "updated_at": "2024-12-29T16:30:08Z", + "actor": { + "login": "DeusDeorum1", + "id": 23059354, + "node_id": "MDQ6VXNlcjIzMDU5MzU0", + "avatar_url": "https://avatars.githubusercontent.com/u/23059354?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/DeusDeorum1", + "html_url": "https://github.com/DeusDeorum1", + "followers_url": "https://api.github.com/users/DeusDeorum1/followers", + "following_url": "https://api.github.com/users/DeusDeorum1/following{/other_user}", + "gists_url": "https://api.github.com/users/DeusDeorum1/gists{/gist_id}", + "starred_url": "https://api.github.com/users/DeusDeorum1/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/DeusDeorum1/subscriptions", + "organizations_url": "https://api.github.com/users/DeusDeorum1/orgs", + "repos_url": "https://api.github.com/users/DeusDeorum1/repos", + "events_url": "https://api.github.com/users/DeusDeorum1/events{/privacy}", + "received_events_url": "https://api.github.com/users/DeusDeorum1/received_events", + "type": "User", + "user_view_type": "public", + "site_admin": false + }, + "run_attempt": 1, + "referenced_workflows": [ + + ], + "run_started_at": "2024-12-29T16:28:42Z", + "triggering_actor": { + "login": "DeusDeorum1", + "id": 23059354, + "node_id": "MDQ6VXNlcjIzMDU5MzU0", + "avatar_url": "https://avatars.githubusercontent.com/u/23059354?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/DeusDeorum1", + "html_url": "https://github.com/DeusDeorum1", + "followers_url": "https://api.github.com/users/DeusDeorum1/followers", + "following_url": "https://api.github.com/users/DeusDeorum1/following{/other_user}", + "gists_url": "https://api.github.com/users/DeusDeorum1/gists{/gist_id}", + "starred_url": "https://api.github.com/users/DeusDeorum1/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/DeusDeorum1/subscriptions", + "organizations_url": "https://api.github.com/users/DeusDeorum1/orgs", + "repos_url": "https://api.github.com/users/DeusDeorum1/repos", + "events_url": "https://api.github.com/users/DeusDeorum1/events{/privacy}", + "received_events_url": "https://api.github.com/users/DeusDeorum1/received_events", + "type": "User", + "user_view_type": "public", + "site_admin": false + }, + "jobs_url": "https://api.github.com/repos/DeusDeorum1/yhome-controller/actions/runs/12537003369/jobs", + "logs_url": "https://api.github.com/repos/DeusDeorum1/yhome-controller/actions/runs/12537003369/logs", + "check_suite_url": "https://api.github.com/repos/DeusDeorum1/yhome-controller/check-suites/32519948712", + "artifacts_url": "https://api.github.com/repos/DeusDeorum1/yhome-controller/actions/runs/12537003369/artifacts", + "cancel_url": "https://api.github.com/repos/DeusDeorum1/yhome-controller/actions/runs/12537003369/cancel", + "rerun_url": "https://api.github.com/repos/DeusDeorum1/yhome-controller/actions/runs/12537003369/rerun", + "previous_attempt_url": null, + "workflow_url": "https://api.github.com/repos/DeusDeorum1/yhome-controller/actions/workflows/133367596", + "head_commit": { + "id": "2c4f2526866d85e29bd7caea0791d861a0c713aa", + "tree_id": "332883d5db0e30b010eac21edf512ba6f005eb92", + "message": "fix step name (#15)", + "timestamp": "2024-12-22T14:25:16Z", + "author": { + "name": "Arina2106", + "email": "77919706+Arina2106@users.noreply.github.com" + }, + "committer": { + "name": "GitHub", + "email": "noreply@github.com" + } + }, + "repository": { + "id": 903682901, + "node_id": "R_kgDONd0bVQ", + "name": "yhome-controller", + "full_name": "DeusDeorum1/yhome-controller", + "private": true, + "owner": { + "login": "DeusDeorum1", + "id": 23059354, + "node_id": "MDQ6VXNlcjIzMDU5MzU0", + "avatar_url": "https://avatars.githubusercontent.com/u/23059354?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/DeusDeorum1", + "html_url": "https://github.com/DeusDeorum1", + "followers_url": "https://api.github.com/users/DeusDeorum1/followers", + "following_url": "https://api.github.com/users/DeusDeorum1/following{/other_user}", + "gists_url": "https://api.github.com/users/DeusDeorum1/gists{/gist_id}", + "starred_url": "https://api.github.com/users/DeusDeorum1/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/DeusDeorum1/subscriptions", + "organizations_url": "https://api.github.com/users/DeusDeorum1/orgs", + "repos_url": "https://api.github.com/users/DeusDeorum1/repos", + "events_url": "https://api.github.com/users/DeusDeorum1/events{/privacy}", + "received_events_url": "https://api.github.com/users/DeusDeorum1/received_events", + "type": "User", + "user_view_type": "public", + "site_admin": false + }, + "html_url": "https://github.com/DeusDeorum1/yhome-controller", + "description": null, + "fork": false, + "url": "https://api.github.com/repos/DeusDeorum1/yhome-controller", + "forks_url": "https://api.github.com/repos/DeusDeorum1/yhome-controller/forks", + "keys_url": "https://api.github.com/repos/DeusDeorum1/yhome-controller/keys{/key_id}", + "collaborators_url": "https://api.github.com/repos/DeusDeorum1/yhome-controller/collaborators{/collaborator}", + "teams_url": "https://api.github.com/repos/DeusDeorum1/yhome-controller/teams", + "hooks_url": "https://api.github.com/repos/DeusDeorum1/yhome-controller/hooks", + "issue_events_url": "https://api.github.com/repos/DeusDeorum1/yhome-controller/issues/events{/number}", + "events_url": "https://api.github.com/repos/DeusDeorum1/yhome-controller/events", + "assignees_url": "https://api.github.com/repos/DeusDeorum1/yhome-controller/assignees{/user}", + "branches_url": "https://api.github.com/repos/DeusDeorum1/yhome-controller/branches{/branch}", + "tags_url": "https://api.github.com/repos/DeusDeorum1/yhome-controller/tags", + "blobs_url": "https://api.github.com/repos/DeusDeorum1/yhome-controller/git/blobs{/sha}", + "git_tags_url": "https://api.github.com/repos/DeusDeorum1/yhome-controller/git/tags{/sha}", + "git_refs_url": "https://api.github.com/repos/DeusDeorum1/yhome-controller/git/refs{/sha}", + "trees_url": "https://api.github.com/repos/DeusDeorum1/yhome-controller/git/trees{/sha}", + "statuses_url": "https://api.github.com/repos/DeusDeorum1/yhome-controller/statuses/{sha}", + "languages_url": "https://api.github.com/repos/DeusDeorum1/yhome-controller/languages", + "stargazers_url": "https://api.github.com/repos/DeusDeorum1/yhome-controller/stargazers", + "contributors_url": "https://api.github.com/repos/DeusDeorum1/yhome-controller/contributors", + "subscribers_url": "https://api.github.com/repos/DeusDeorum1/yhome-controller/subscribers", + "subscription_url": "https://api.github.com/repos/DeusDeorum1/yhome-controller/subscription", + "commits_url": "https://api.github.com/repos/DeusDeorum1/yhome-controller/commits{/sha}", + "git_commits_url": "https://api.github.com/repos/DeusDeorum1/yhome-controller/git/commits{/sha}", + "comments_url": "https://api.github.com/repos/DeusDeorum1/yhome-controller/comments{/number}", + "issue_comment_url": "https://api.github.com/repos/DeusDeorum1/yhome-controller/issues/comments{/number}", + "contents_url": "https://api.github.com/repos/DeusDeorum1/yhome-controller/contents/{+path}", + "compare_url": "https://api.github.com/repos/DeusDeorum1/yhome-controller/compare/{base}...{head}", + "merges_url": "https://api.github.com/repos/DeusDeorum1/yhome-controller/merges", + "archive_url": "https://api.github.com/repos/DeusDeorum1/yhome-controller/{archive_format}{/ref}", + "downloads_url": "https://api.github.com/repos/DeusDeorum1/yhome-controller/downloads", + "issues_url": "https://api.github.com/repos/DeusDeorum1/yhome-controller/issues{/number}", + "pulls_url": "https://api.github.com/repos/DeusDeorum1/yhome-controller/pulls{/number}", + "milestones_url": "https://api.github.com/repos/DeusDeorum1/yhome-controller/milestones{/number}", + "notifications_url": "https://api.github.com/repos/DeusDeorum1/yhome-controller/notifications{?since,all,participating}", + "labels_url": "https://api.github.com/repos/DeusDeorum1/yhome-controller/labels{/name}", + "releases_url": "https://api.github.com/repos/DeusDeorum1/yhome-controller/releases{/id}", + "deployments_url": "https://api.github.com/repos/DeusDeorum1/yhome-controller/deployments" + }, + "head_repository": { + "id": 903682901, + "node_id": "R_kgDONd0bVQ", + "name": "yhome-controller", + "full_name": "DeusDeorum1/yhome-controller", + "private": true, + "owner": { + "login": "DeusDeorum1", + "id": 23059354, + "node_id": "MDQ6VXNlcjIzMDU5MzU0", + "avatar_url": "https://avatars.githubusercontent.com/u/23059354?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/DeusDeorum1", + "html_url": "https://github.com/DeusDeorum1", + "followers_url": "https://api.github.com/users/DeusDeorum1/followers", + "following_url": "https://api.github.com/users/DeusDeorum1/following{/other_user}", + "gists_url": "https://api.github.com/users/DeusDeorum1/gists{/gist_id}", + "starred_url": "https://api.github.com/users/DeusDeorum1/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/DeusDeorum1/subscriptions", + "organizations_url": "https://api.github.com/users/DeusDeorum1/orgs", + "repos_url": "https://api.github.com/users/DeusDeorum1/repos", + "events_url": "https://api.github.com/users/DeusDeorum1/events{/privacy}", + "received_events_url": "https://api.github.com/users/DeusDeorum1/received_events", + "type": "User", + "user_view_type": "public", + "site_admin": false + }, + "html_url": "https://github.com/DeusDeorum1/yhome-controller", + "description": null, + "fork": false, + "url": "https://api.github.com/repos/DeusDeorum1/yhome-controller", + "forks_url": "https://api.github.com/repos/DeusDeorum1/yhome-controller/forks", + "keys_url": "https://api.github.com/repos/DeusDeorum1/yhome-controller/keys{/key_id}", + "collaborators_url": "https://api.github.com/repos/DeusDeorum1/yhome-controller/collaborators{/collaborator}", + "teams_url": "https://api.github.com/repos/DeusDeorum1/yhome-controller/teams", + "hooks_url": "https://api.github.com/repos/DeusDeorum1/yhome-controller/hooks", + "issue_events_url": "https://api.github.com/repos/DeusDeorum1/yhome-controller/issues/events{/number}", + "events_url": "https://api.github.com/repos/DeusDeorum1/yhome-controller/events", + "assignees_url": "https://api.github.com/repos/DeusDeorum1/yhome-controller/assignees{/user}", + "branches_url": "https://api.github.com/repos/DeusDeorum1/yhome-controller/branches{/branch}", + "tags_url": "https://api.github.com/repos/DeusDeorum1/yhome-controller/tags", + "blobs_url": "https://api.github.com/repos/DeusDeorum1/yhome-controller/git/blobs{/sha}", + "git_tags_url": "https://api.github.com/repos/DeusDeorum1/yhome-controller/git/tags{/sha}", + "git_refs_url": "https://api.github.com/repos/DeusDeorum1/yhome-controller/git/refs{/sha}", + "trees_url": "https://api.github.com/repos/DeusDeorum1/yhome-controller/git/trees{/sha}", + "statuses_url": "https://api.github.com/repos/DeusDeorum1/yhome-controller/statuses/{sha}", + "languages_url": "https://api.github.com/repos/DeusDeorum1/yhome-controller/languages", + "stargazers_url": "https://api.github.com/repos/DeusDeorum1/yhome-controller/stargazers", + "contributors_url": "https://api.github.com/repos/DeusDeorum1/yhome-controller/contributors", + "subscribers_url": "https://api.github.com/repos/DeusDeorum1/yhome-controller/subscribers", + "subscription_url": "https://api.github.com/repos/DeusDeorum1/yhome-controller/subscription", + "commits_url": "https://api.github.com/repos/DeusDeorum1/yhome-controller/commits{/sha}", + "git_commits_url": "https://api.github.com/repos/DeusDeorum1/yhome-controller/git/commits{/sha}", + "comments_url": "https://api.github.com/repos/DeusDeorum1/yhome-controller/comments{/number}", + "issue_comment_url": "https://api.github.com/repos/DeusDeorum1/yhome-controller/issues/comments{/number}", + "contents_url": "https://api.github.com/repos/DeusDeorum1/yhome-controller/contents/{+path}", + "compare_url": "https://api.github.com/repos/DeusDeorum1/yhome-controller/compare/{base}...{head}", + "merges_url": "https://api.github.com/repos/DeusDeorum1/yhome-controller/merges", + "archive_url": "https://api.github.com/repos/DeusDeorum1/yhome-controller/{archive_format}{/ref}", + "downloads_url": "https://api.github.com/repos/DeusDeorum1/yhome-controller/downloads", + "issues_url": "https://api.github.com/repos/DeusDeorum1/yhome-controller/issues{/number}", + "pulls_url": "https://api.github.com/repos/DeusDeorum1/yhome-controller/pulls{/number}", + "milestones_url": "https://api.github.com/repos/DeusDeorum1/yhome-controller/milestones{/number}", + "notifications_url": "https://api.github.com/repos/DeusDeorum1/yhome-controller/notifications{?since,all,participating}", + "labels_url": "https://api.github.com/repos/DeusDeorum1/yhome-controller/labels{/name}", + "releases_url": "https://api.github.com/repos/DeusDeorum1/yhome-controller/releases{/id}", + "deployments_url": "https://api.github.com/repos/DeusDeorum1/yhome-controller/deployments" + } + }, + "workflow": { + "id": 133367596, + "node_id": "W_kwDONd0bVc4H8wcs", + "name": ".NET", + "path": ".github/workflows/dotnet.yml", + "state": "active", + "created_at": "2024-12-15T09:57:52.000Z", + "updated_at": "2024-12-15T12:11:31.000Z", + "url": "https://api.github.com/repos/DeusDeorum1/yhome-controller/actions/workflows/133367596", + "html_url": "https://github.com/DeusDeorum1/yhome-controller/blob/develop/.github/workflows/dotnet.yml", + "badge_url": "https://github.com/DeusDeorum1/yhome-controller/workflows/.NET/badge.svg" + }, + "repository": { + "id": 903682901, + "node_id": "R_kgDONd0bVQ", + "name": "yhome-controller", + "full_name": "DeusDeorum1/yhome-controller", + "private": true, + "owner": { + "login": "DeusDeorum1", + "id": 23059354, + "node_id": "MDQ6VXNlcjIzMDU5MzU0", + "avatar_url": "https://avatars.githubusercontent.com/u/23059354?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/DeusDeorum1", + "html_url": "https://github.com/DeusDeorum1", + "followers_url": "https://api.github.com/users/DeusDeorum1/followers", + "following_url": "https://api.github.com/users/DeusDeorum1/following{/other_user}", + "gists_url": "https://api.github.com/users/DeusDeorum1/gists{/gist_id}", + "starred_url": "https://api.github.com/users/DeusDeorum1/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/DeusDeorum1/subscriptions", + "organizations_url": "https://api.github.com/users/DeusDeorum1/orgs", + "repos_url": "https://api.github.com/users/DeusDeorum1/repos", + "events_url": "https://api.github.com/users/DeusDeorum1/events{/privacy}", + "received_events_url": "https://api.github.com/users/DeusDeorum1/received_events", + "type": "User", + "user_view_type": "public", + "site_admin": false + }, + "html_url": "https://github.com/DeusDeorum1/yhome-controller", + "description": null, + "fork": false, + "url": "https://api.github.com/repos/DeusDeorum1/yhome-controller", + "forks_url": "https://api.github.com/repos/DeusDeorum1/yhome-controller/forks", + "keys_url": "https://api.github.com/repos/DeusDeorum1/yhome-controller/keys{/key_id}", + "collaborators_url": "https://api.github.com/repos/DeusDeorum1/yhome-controller/collaborators{/collaborator}", + "teams_url": "https://api.github.com/repos/DeusDeorum1/yhome-controller/teams", + "hooks_url": "https://api.github.com/repos/DeusDeorum1/yhome-controller/hooks", + "issue_events_url": "https://api.github.com/repos/DeusDeorum1/yhome-controller/issues/events{/number}", + "events_url": "https://api.github.com/repos/DeusDeorum1/yhome-controller/events", + "assignees_url": "https://api.github.com/repos/DeusDeorum1/yhome-controller/assignees{/user}", + "branches_url": "https://api.github.com/repos/DeusDeorum1/yhome-controller/branches{/branch}", + "tags_url": "https://api.github.com/repos/DeusDeorum1/yhome-controller/tags", + "blobs_url": "https://api.github.com/repos/DeusDeorum1/yhome-controller/git/blobs{/sha}", + "git_tags_url": "https://api.github.com/repos/DeusDeorum1/yhome-controller/git/tags{/sha}", + "git_refs_url": "https://api.github.com/repos/DeusDeorum1/yhome-controller/git/refs{/sha}", + "trees_url": "https://api.github.com/repos/DeusDeorum1/yhome-controller/git/trees{/sha}", + "statuses_url": "https://api.github.com/repos/DeusDeorum1/yhome-controller/statuses/{sha}", + "languages_url": "https://api.github.com/repos/DeusDeorum1/yhome-controller/languages", + "stargazers_url": "https://api.github.com/repos/DeusDeorum1/yhome-controller/stargazers", + "contributors_url": "https://api.github.com/repos/DeusDeorum1/yhome-controller/contributors", + "subscribers_url": "https://api.github.com/repos/DeusDeorum1/yhome-controller/subscribers", + "subscription_url": "https://api.github.com/repos/DeusDeorum1/yhome-controller/subscription", + "commits_url": "https://api.github.com/repos/DeusDeorum1/yhome-controller/commits{/sha}", + "git_commits_url": "https://api.github.com/repos/DeusDeorum1/yhome-controller/git/commits{/sha}", + "comments_url": "https://api.github.com/repos/DeusDeorum1/yhome-controller/comments{/number}", + "issue_comment_url": "https://api.github.com/repos/DeusDeorum1/yhome-controller/issues/comments{/number}", + "contents_url": "https://api.github.com/repos/DeusDeorum1/yhome-controller/contents/{+path}", + "compare_url": "https://api.github.com/repos/DeusDeorum1/yhome-controller/compare/{base}...{head}", + "merges_url": "https://api.github.com/repos/DeusDeorum1/yhome-controller/merges", + "archive_url": "https://api.github.com/repos/DeusDeorum1/yhome-controller/{archive_format}{/ref}", + "downloads_url": "https://api.github.com/repos/DeusDeorum1/yhome-controller/downloads", + "issues_url": "https://api.github.com/repos/DeusDeorum1/yhome-controller/issues{/number}", + "pulls_url": "https://api.github.com/repos/DeusDeorum1/yhome-controller/pulls{/number}", + "milestones_url": "https://api.github.com/repos/DeusDeorum1/yhome-controller/milestones{/number}", + "notifications_url": "https://api.github.com/repos/DeusDeorum1/yhome-controller/notifications{?since,all,participating}", + "labels_url": "https://api.github.com/repos/DeusDeorum1/yhome-controller/labels{/name}", + "releases_url": "https://api.github.com/repos/DeusDeorum1/yhome-controller/releases{/id}", + "deployments_url": "https://api.github.com/repos/DeusDeorum1/yhome-controller/deployments", + "created_at": "2024-12-15T09:23:35Z", + "updated_at": "2024-12-22T14:25:20Z", + "pushed_at": "2024-12-29T16:28:40Z", + "git_url": "git://github.com/DeusDeorum1/yhome-controller.git", + "ssh_url": "git@github.com:DeusDeorum1/yhome-controller.git", + "clone_url": "https://github.com/DeusDeorum1/yhome-controller.git", + "svn_url": "https://github.com/DeusDeorum1/yhome-controller", + "homepage": null, + "size": 813, + "stargazers_count": 0, + "watchers_count": 0, + "language": "C#", + "has_issues": true, + "has_projects": true, + "has_downloads": true, + "has_wiki": false, + "has_pages": false, + "has_discussions": false, + "forks_count": 0, + "mirror_url": null, + "archived": false, + "disabled": false, + "open_issues_count": 0, + "license": null, + "allow_forking": true, + "is_template": false, + "web_commit_signoff_required": false, + "topics": [ + + ], + "visibility": "private", + "forks": 0, + "open_issues": 0, + "watchers": 0, + "default_branch": "develop" + }, + "sender": { + "login": "DeusDeorum1", + "id": 23059354, + "node_id": "MDQ6VXNlcjIzMDU5MzU0", + "avatar_url": "https://avatars.githubusercontent.com/u/23059354?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/DeusDeorum1", + "html_url": "https://github.com/DeusDeorum1", + "followers_url": "https://api.github.com/users/DeusDeorum1/followers", + "following_url": "https://api.github.com/users/DeusDeorum1/following{/other_user}", + "gists_url": "https://api.github.com/users/DeusDeorum1/gists{/gist_id}", + "starred_url": "https://api.github.com/users/DeusDeorum1/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/DeusDeorum1/subscriptions", + "organizations_url": "https://api.github.com/users/DeusDeorum1/orgs", + "repos_url": "https://api.github.com/users/DeusDeorum1/repos", + "events_url": "https://api.github.com/users/DeusDeorum1/events{/privacy}", + "received_events_url": "https://api.github.com/users/DeusDeorum1/received_events", + "type": "User", + "user_view_type": "public", + "site_admin": false + } +}` +} diff --git a/plugins/inputs/webhooks/github/github_webhooks_models.go b/plugins/inputs/webhooks/github/github_webhooks_models.go index b7e0e44f2..8bc989a3f 100644 --- a/plugins/inputs/webhooks/github/github_webhooks_models.go +++ b/plugins/inputs/webhooks/github/github_webhooks_models.go @@ -75,6 +75,26 @@ type pullRequestReviewComment struct { Comment string `json:"body"` } +type workflowJob struct { + RunAttempt int `json:"run_attempt"` + HeadBranch string `json:"head_branch"` + CreatedAt time.Time `json:"created_at"` + StartedAt time.Time `json:"started_at"` + CompletedAt time.Time `json:"completed_at"` + Name string `json:"name"` + Conclusion string `json:"conclusion"` +} + +type workflowRun struct { + HeadBranch string `json:"head_branch"` + CreatedAt time.Time `json:"created_at"` + RunStartedAt time.Time `json:"run_started_at"` + UpdatedAt time.Time `json:"updated_at"` + RunAttempt int `json:"run_attempt"` + Name string `json:"name"` + Conclusion string `json:"conclusion"` +} + type release struct { TagName string `json:"tag_name"` } @@ -646,3 +666,74 @@ func (s watchEvent) newMetric() telegraf.Metric { m := metric.New(meas, t, f, time.Now()) return m } + +type workflowJobEvent struct { + Action string `json:"action"` + WorkflowJob workflowJob `json:"workflow_job"` + Repository repository `json:"repository"` + Sender sender `json:"sender"` +} + +func (s workflowJobEvent) newMetric() telegraf.Metric { + event := "workflow_job" + t := map[string]string{ + "event": event, + "action": s.Action, + "repository": s.Repository.Repository, + "private": strconv.FormatBool(s.Repository.Private), + "user": s.Sender.User, + "admin": strconv.FormatBool(s.Sender.Admin), + "name": s.WorkflowJob.Name, + "conclusion": s.WorkflowJob.Conclusion, + } + + var runTimeMs int64 + var queueTimeMs int64 + if s.Action == "in_progress" { + queueTimeMs = s.WorkflowJob.StartedAt.Sub(s.WorkflowJob.CreatedAt).Milliseconds() + } + if s.Action == "completed" { + runTimeMs = s.WorkflowJob.CompletedAt.Sub(s.WorkflowJob.StartedAt).Milliseconds() + } + f := map[string]interface{}{ + "run_attempt": s.WorkflowJob.RunAttempt, + "queue_time": queueTimeMs, + "run_time": runTimeMs, + "head_branch": s.WorkflowJob.HeadBranch, + } + m := metric.New(meas, t, f, time.Now()) + return m +} + +type workflowRunEvent struct { + Action string `json:"action"` + WorkflowRun workflowRun `json:"workflow_run"` + Repository repository `json:"repository"` + Sender sender `json:"sender"` +} + +func (s workflowRunEvent) newMetric() telegraf.Metric { + event := "workflow_run" + t := map[string]string{ + "event": event, + "action": s.Action, + "repository": s.Repository.Repository, + "private": strconv.FormatBool(s.Repository.Private), + "user": s.Sender.User, + "admin": strconv.FormatBool(s.Sender.Admin), + "name": s.WorkflowRun.Name, + "conclusion": s.WorkflowRun.Conclusion, + } + var runTimeMs int64 + + if s.Action == "completed" { + runTimeMs = s.WorkflowRun.UpdatedAt.Sub(s.WorkflowRun.RunStartedAt).Milliseconds() + } + f := map[string]interface{}{ + "run_attempt": s.WorkflowRun.RunAttempt, + "run_time": runTimeMs, + "head_branch": s.WorkflowRun.HeadBranch, + } + m := metric.New(meas, t, f, time.Now()) + return m +} diff --git a/plugins/inputs/webhooks/github/github_webhooks_test.go b/plugins/inputs/webhooks/github/github_webhooks_test.go index e8c787c48..d25a12679 100644 --- a/plugins/inputs/webhooks/github/github_webhooks_test.go +++ b/plugins/inputs/webhooks/github/github_webhooks_test.go @@ -126,6 +126,14 @@ func TestEventWithSignatureSuccess(t *testing.T) { githubWebhookRequestWithSignature(t, "watch", watchEventJSON(), generateSignature("signature", []byte(watchEventJSON())), http.StatusOK) } +func TestWorkflowJob(t *testing.T) { + githubWebhookRequest(t, "workflow_job", WorkflowJobJSON()) +} + +func TestWorkflowRun(t *testing.T) { + githubWebhookRequest(t, "workflow_run", WorkflowRunJSON()) +} + func TestCheckSignatureSuccess(t *testing.T) { if !checkSignature("my_little_secret", []byte("random-signature-body"), "sha1=3dca279e731c97c38e3019a075dee9ebbd0a99f0") { t.Errorf("check signature failed")