Skip to content

Commit 7c0b4f6

Browse files
committed
Capture githubRateLimitRemaining metric in CloudWatch
1 parent d3bd054 commit 7c0b4f6

File tree

4 files changed

+39
-8
lines changed

4 files changed

+39
-8
lines changed

src/app/domain/github/crawler/crawlInstallation.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ export async function crawlInstallation(
1515
logger.info(`Crawling Installation for ${installation.accountLogin}`)
1616
const githubInstallationClient = appState.githubClient.clientForInstallation(installation.installationId)
1717
await crawlUsers(appState, installation, githubInstallationClient)
18-
publishGithubInstallationClientMetrics(installation, githubInstallationClient)
18+
publishGithubInstallationClientMetrics(githubInstallationClient)
1919
const repos = await crawlRepositories(appState, installation, githubInstallationClient)
2020
// Eventually consider doing some parallelization here (or move back to step function) but
2121
// need to be careful since GitHub gets twitchy about concurrent requests to the API
@@ -25,6 +25,6 @@ export async function crawlInstallation(
2525
await crawlPushes(appState, installation, repo, githubInstallationClient)
2626
await crawlWorkflowRunEvents(appState, installation, repo, lookbackDays, githubInstallationClient)
2727
}
28-
publishGithubInstallationClientMetrics(installation, githubInstallationClient)
28+
publishGithubInstallationClientMetrics(githubInstallationClient)
2929
logger.info('Github Metadata after crawls', { ...githubInstallationClient.meta() })
3030
}

src/app/outboundInterfaces/githubInstallationClient.ts

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ import { RawGithubWorkflowRunEvent } from '../domain/types/rawGithub/RawGithubWo
44
import { RawGithubRepository } from '../domain/types/rawGithub/RawGithubRepository'
55
import { RawGithubUser } from '../domain/types/rawGithub/RawGithubUser'
66
import { RawGithubEvent } from '../domain/types/rawGithub/RawGithubEvent'
7-
import { GithubInstallation } from '../domain/types/GithubInstallation'
87
import { metrics } from '../util/metrics'
98
import { MetricUnit } from '@aws-lambda-powertools/metrics'
109

@@ -132,13 +131,13 @@ export type OctokitResponseHeaders = {
132131
}
133132

134133
// ToEventually - move this into the actual GithubInstallationClient object
135-
export function publishGithubInstallationClientMetrics(
136-
installation: GithubInstallation,
137-
githubInstallationClient: GithubInstallationClient
138-
) {
134+
export function publishGithubInstallationClientMetrics(githubInstallationClient: GithubInstallationClient) {
135+
// Eventually considering adding "installation" as a dimension here to allow different metrics / alarms
136+
// for different installations. The reason I didn't just do that immediately is that, for now, Alarms
137+
// are defined at deployment time, but installations are a runtime concept.
139138
const rateLimitMetric = metrics.singleMetric()
140-
rateLimitMetric.addDimension('installationAccount', installation.accountLogin)
141139
rateLimitMetric.addMetric(
140+
// ToEventually - this is a shared string with CDK so move to constant
142141
'githubRateLimitRemaining',
143142
MetricUnit.Count,
144143
githubInstallationClient.meta().ratelimitRemaining

src/cdk/stacks/main/MainStack.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import { saveInSSMViaCloudFormation } from '../../support/ssm'
99
import { SSM_PARAM_NAMES, SsmParamName } from '../../../multipleContexts/ssmParams'
1010
import { defineGithubCrawlers } from './githubCrawlers'
1111
import { ReportingStack } from './reporting/ReportingStack'
12+
import { defineMonitoring } from './monitoring'
1213

1314
export class MainStack extends Stack {
1415
constructor(scope: Construct, id: string, props: AllStacksProps) {
@@ -32,6 +33,8 @@ export class MainStack extends Stack {
3233

3334
savePreGeneratedConfiguration(this, props)
3435

36+
defineMonitoring(this, mainStackProps)
37+
3538
new ReportingStack(this, 'ReportingStack', {
3639
...props,
3740
stackName: `${props.appName}-reporting`

src/cdk/stacks/main/monitoring.ts

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
import { Alarm, ComparisonOperator, Metric, TreatMissingData } from 'aws-cdk-lib/aws-cloudwatch'
2+
import { Construct } from 'constructs'
3+
import { MainStackProps } from './mainStackProps'
4+
import { Duration } from 'aws-cdk-lib'
5+
import { SnsAction } from 'aws-cdk-lib/aws-cloudwatch-actions'
6+
import { Topic } from 'aws-cdk-lib/aws-sns'
7+
8+
export function defineMonitoring(scope: Construct, props: MainStackProps) {
9+
const githubRateLimitRemainingAlarm = new Alarm(scope, 'Errors', {
10+
comparisonOperator: ComparisonOperator.LESS_THAN_THRESHOLD,
11+
threshold: 1000,
12+
evaluationPeriods: 1,
13+
treatMissingData: TreatMissingData.IGNORE,
14+
alarmName: `${props.appName} - Github Rate Limit Remaining`,
15+
metric: new Metric({
16+
namespace: 'cicada',
17+
dimensionsMap: {
18+
service: props.appName
19+
},
20+
// ToEventually - this is a shared string with app code so move to constant
21+
metricName: 'githubRateLimitRemaining',
22+
statistic: 'Minimum',
23+
period: Duration.days(1)
24+
})
25+
})
26+
27+
const actionTopic = new Topic(scope, 'alarmActionTopic', { topicName: `${props.appName}-alarms` })
28+
githubRateLimitRemainingAlarm.addAlarmAction(new SnsAction(actionTopic))
29+
}

0 commit comments

Comments
 (0)