Repository files navigation

Modifications

  • reduce metrics, don't emit latency
  • improve the template with KMS, SNS, Alarms, Encryption, ...
  • change error code to 999

Lambda Ping

Lambda Ping is a small service which checks the HTTP response code and latency for one or more supplied endpoints. It returns this data both directly in the form of a JSON object that can be consumed by other applications, as well as saving the results to CloudWatch.

Because the data is in CloudWatch, you can use the results to trigger other events when an endpoint fails/recovers or performs too slowly by creating CloudWatch Alarms with the metrics recorded. For example, it becomes very easy to send alerts on endpoint health, trigger another Lambda or consume the alarm with another AWS service such as Route53 failover.

Cloudwatch Example

How it works

Once supplied with a JSON list of HTTP or HTTPS endpoints, this Lambda hits them concurrently and returns the status code and total query time. We take advantage of NodeJS's callback model to allow easy concurrent execution when running the tests, so the Lambda only runs for as long as it takes for the slowest query to complete. A max timeout of 10 seconds applies.

Why not ICMP?

Sadly there is no way to do ICMP pings from inside AWS Lambda currently - the main issue is that the container environment that Lambdas run inside of lacks the CAP_NET_RAW capability needed to allow an application to use raw sockets.

There's no way around this, even trying to use the command line ping utility inside the Amazon Linux container the Lambda runs inside of won't work.

The annoyance of course is that this means anything you want to monitor needs to be running a webserver of some kind. It doesn't have to be a full-blown installation of Apache, you could use one of the many higher languages to make a one line web server or if you get really desperate, here's one in C code.

This sucks, I want better metrics

If you're really serious about your monitoring and metrics, you probably want to look at something like Smokeping which has much better stats and graphing for the purpose of packet loss and latency than this Lambda will ever be capable of with CloudWatch graphs.

Installation

  1. Install the AWS SAM CLI: https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/install-sam-cli.html
  2. Build the application:
    sam build
  3. Deploy the application:
    sam deploy --guided

Usage

To use the Lambda manually, invoke the Lambda with a JSON object defining the endpoints as an array:

sam remote invoke PingFunction --stack-name lambda-ping --event '["http://www.google.com", "https://www.jethrocarr.com"]'```The functionreturns a JSON object with the results. {"http://www.google.com": {"statusCode": 200,"durationMS": 169.88141500001075 },"https://www.jethrocarr.com": {"statusCode": 200,"durationMS": 6757.3228579999995 } }Generally you'll probably want to automatically ping the endpoints on a regularbasis. To do this, create a EventBridge schedule. This allows you to have completeflexibility over when and how frequently you execute your pings - for example,you might ping one endpoint every minute, whilst another might only need to beonce an hour.To do this, modify the `CloudWatch Event Configuration` section in `template.yaml`and then build and deploy the SAM package.```yaml... Events: ScheduledPing: Type: Schedule Properties: Schedule: rate(5 minutes) Input: '["https://www.jethrocarr.com", "https://www.google.com"]'

Or you can manually create a new scheduled event using Amazon EventBridge:

  1. Open the Amazon EventBridge console in AWS.
  2. Select EventBridgeSchedule
  3. Click Create rule.
  4. Set your desired schedule expression (e.g., rate(5 minutes) or a cron expression).
  5. Under Target, choose Lambda function.
  6. Select your Lambda function (e.g., ping-STAGE-http) from the dropdown.
  7. In the Configure input section, choose Constant (JSON text) and provide the array of endpoints to test on this schedule. For example: ["http://www.google.com", "http://github.com"]
  8. Complete the rule creation process.

You can create as many EventBridge rules as you want, on as many different schedules as you need. For cost efficiency, test as many endpoints as possible using the fewest rules, since all endpoints in a single rule are tested concurrently, reducing Lambda execution time.

You can create as many rules as you want, on as many different schedules as you want. Note that is is more cost effective to test as many endpoints using the fewest rules possible, since all endpoints in a single rule get tests concurrently reducing our Lambda's execution time.

Example CloudWatch Event

Contributions

All manner of contributions are welcome in the form of a Pull Request.

License

Copyright (c) 2025 Jethro Carr
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.

About

Check response code & latency of remote endpoints and graph in CloudWatch

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Repository files navigation

Modifications

  • reduce metrics, don't emit latency
  • improve the template with KMS, SNS, Alarms, Encryption, ...
  • change error code to 999

Lambda Ping

Lambda Ping is a small service which checks the HTTP response code and latency for one or more supplied endpoints. It returns this data both directly in the form of a JSON object that can be consumed by other applications, as well as saving the results to CloudWatch.

Because the data is in CloudWatch, you can use the results to trigger other events when an endpoint fails/recovers or performs too slowly by creating CloudWatch Alarms with the metrics recorded. For example, it becomes very easy to send alerts on endpoint health, trigger another Lambda or consume the alarm with another AWS service such as Route53 failover.

Cloudwatch Example

How it works

Once supplied with a JSON list of HTTP or HTTPS endpoints, this Lambda hits them concurrently and returns the status code and total query time. We take advantage of NodeJS's callback model to allow easy concurrent execution when running the tests, so the Lambda only runs for as long as it takes for the slowest query to complete. A max timeout of 10 seconds applies.

Why not ICMP?

Sadly there is no way to do ICMP pings from inside AWS Lambda currently - the main issue is that the container environment that Lambdas run inside of lacks the CAP_NET_RAW capability needed to allow an application to use raw sockets.

There's no way around this, even trying to use the command line ping utility inside the Amazon Linux container the Lambda runs inside of won't work.

The annoyance of course is that this means anything you want to monitor needs to be running a webserver of some kind. It doesn't have to be a full-blown installation of Apache, you could use one of the many higher languages to make a one line web server or if you get really desperate, here's one in C code.

This sucks, I want better metrics

If you're really serious about your monitoring and metrics, you probably want to look at something like Smokeping which has much better stats and graphing for the purpose of packet loss and latency than this Lambda will ever be capable of with CloudWatch graphs.

Installation

  1. Install the AWS SAM CLI: https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/install-sam-cli.html
  2. Build the application:
    sam build
  3. Deploy the application:
    sam deploy --guided

Usage

To use the Lambda manually, invoke the Lambda with a JSON object defining the endpoints as an array:

sam remote invoke PingFunction --stack-name lambda-ping --event '["http://www.google.com", "https://www.jethrocarr.com"]'```The functionreturns a JSON object with the results. {"http://www.google.com": {"statusCode": 200,"durationMS": 169.88141500001075 },"https://www.jethrocarr.com": {"statusCode": 200,"durationMS": 6757.3228579999995 } }Generally you'll probably want to automatically ping the endpoints on a regularbasis. To do this, create a EventBridge schedule. This allows you to have completeflexibility over when and how frequently you execute your pings - for example,you might ping one endpoint every minute, whilst another might only need to beonce an hour.To do this, modify the `CloudWatch Event Configuration` section in `template.yaml`and then build and deploy the SAM package.```yaml... Events: ScheduledPing: Type: Schedule Properties: Schedule: rate(5 minutes) Input: '["https://www.jethrocarr.com", "https://www.google.com"]'

Or you can manually create a new scheduled event using Amazon EventBridge:

  1. Open the Amazon EventBridge console in AWS.
  2. Select EventBridgeSchedule
  3. Click Create rule.
  4. Set your desired schedule expression (e.g., rate(5 minutes) or a cron expression).
  5. Under Target, choose Lambda function.
  6. Select your Lambda function (e.g., ping-STAGE-http) from the dropdown.
  7. In the Configure input section, choose Constant (JSON text) and provide the array of endpoints to test on this schedule. For example: ["http://www.google.com", "http://github.com"]
  8. Complete the rule creation process.

You can create as many EventBridge rules as you want, on as many different schedules as you need. For cost efficiency, test as many endpoints as possible using the fewest rules, since all endpoints in a single rule are tested concurrently, reducing Lambda execution time.

You can create as many rules as you want, on as many different schedules as you want. Note that is is more cost effective to test as many endpoints using the fewest rules possible, since all endpoints in a single rule get tests concurrently reducing our Lambda's execution time.

Example CloudWatch Event

Contributions

All manner of contributions are welcome in the form of a Pull Request.

License

Copyright (c) 2025 Jethro Carr
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.

About

Check response code & latency of remote endpoints and graph in CloudWatch

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Modifications

  • reduce metrics, don't emit latency
  • improve the template with KMS, SNS, Alarms, Encryption, ...
  • change error code to 999

Lambda Ping

Lambda Ping is a small service which checks the HTTP response code and latency for one or more supplied endpoints. It returns this data both directly in the form of a JSON object that can be consumed by other applications, as well as saving the results to CloudWatch.

Because the data is in CloudWatch, you can use the results to trigger other events when an endpoint fails/recovers or performs too slowly by creating CloudWatch Alarms with the metrics recorded. For example, it becomes very easy to send alerts on endpoint health, trigger another Lambda or consume the alarm with another AWS service such as Route53 failover.

Cloudwatch Example

How it works

Once supplied with a JSON list of HTTP or HTTPS endpoints, this Lambda hits them concurrently and returns the status code and total query time. We take advantage of NodeJS's callback model to allow easy concurrent execution when running the tests, so the Lambda only runs for as long as it takes for the slowest query to complete. A max timeout of 10 seconds applies.

Why not ICMP?

Sadly there is no way to do ICMP pings from inside AWS Lambda currently - the main issue is that the container environment that Lambdas run inside of lacks the CAP_NET_RAW capability needed to allow an application to use raw sockets.

There's no way around this, even trying to use the command line ping utility inside the Amazon Linux container the Lambda runs inside of won't work.

The annoyance of course is that this means anything you want to monitor needs to be running a webserver of some kind. It doesn't have to be a full-blown installation of Apache, you could use one of the many higher languages to make a one line web server or if you get really desperate, here's one in C code.

This sucks, I want better metrics

If you're really serious about your monitoring and metrics, you probably want to look at something like Smokeping which has much better stats and graphing for the purpose of packet loss and latency than this Lambda will ever be capable of with CloudWatch graphs.

Installation

  1. Install the AWS SAM CLI: https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/install-sam-cli.html
  2. Build the application:
    sam build
  3. Deploy the application:
    sam deploy --guided

Usage

To use the Lambda manually, invoke the Lambda with a JSON object defining the endpoints as an array:

sam remote invoke PingFunction --stack-name lambda-ping --event '["http://www.google.com", "https://www.jethrocarr.com"]'```The functionreturns a JSON object with the results. {"http://www.google.com": {"statusCode": 200,"durationMS": 169.88141500001075 },"https://www.jethrocarr.com": {"statusCode": 200,"durationMS": 6757.3228579999995 } }Generally you'll probably want to automatically ping the endpoints on a regularbasis. To do this, create a EventBridge schedule. This allows you to have completeflexibility over when and how frequently you execute your pings - for example,you might ping one endpoint every minute, whilst another might only need to beonce an hour.To do this, modify the `CloudWatch Event Configuration` section in `template.yaml`and then build and deploy the SAM package.```yaml... Events: ScheduledPing: Type: Schedule Properties: Schedule: rate(5 minutes) Input: '["https://www.jethrocarr.com", "https://www.google.com"]'

Or you can manually create a new scheduled event using Amazon EventBridge:

  1. Open the Amazon EventBridge console in AWS.
  2. Select EventBridgeSchedule
  3. Click Create rule.
  4. Set your desired schedule expression (e.g., rate(5 minutes) or a cron expression).
  5. Under Target, choose Lambda function.
  6. Select your Lambda function (e.g., ping-STAGE-http) from the dropdown.
  7. In the Configure input section, choose Constant (JSON text) and provide the array of endpoints to test on this schedule. For example: ["http://www.google.com", "http://github.com"]
  8. Complete the rule creation process.

You can create as many EventBridge rules as you want, on as many different schedules as you need. For cost efficiency, test as many endpoints as possible using the fewest rules, since all endpoints in a single rule are tested concurrently, reducing Lambda execution time.

You can create as many rules as you want, on as many different schedules as you want. Note that is is more cost effective to test as many endpoints using the fewest rules possible, since all endpoints in a single rule get tests concurrently reducing our Lambda's execution time.

Example CloudWatch Event

Contributions

All manner of contributions are welcome in the form of a Pull Request.

License

Copyright (c) 2025 Jethro Carr
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.

About

Check response code & latency of remote endpoints and graph in CloudWatch

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Modifications

  • reduce metrics, don't emit latency
  • improve the template with KMS, SNS, Alarms, Encryption, ...
  • change error code to 999

Lambda Ping

Lambda Ping is a small service which checks the HTTP response code and latency for one or more supplied endpoints. It returns this data both directly in the form of a JSON object that can be consumed by other applications, as well as saving the results to CloudWatch.

Because the data is in CloudWatch, you can use the results to trigger other events when an endpoint fails/recovers or performs too slowly by creating CloudWatch Alarms with the metrics recorded. For example, it becomes very easy to send alerts on endpoint health, trigger another Lambda or consume the alarm with another AWS service such as Route53 failover.

Cloudwatch Example

How it works

Once supplied with a JSON list of HTTP or HTTPS endpoints, this Lambda hits them concurrently and returns the status code and total query time. We take advantage of NodeJS's callback model to allow easy concurrent execution when running the tests, so the Lambda only runs for as long as it takes for the slowest query to complete. A max timeout of 10 seconds applies.

Why not ICMP?

Sadly there is no way to do ICMP pings from inside AWS Lambda currently - the main issue is that the container environment that Lambdas run inside of lacks the CAP_NET_RAW capability needed to allow an application to use raw sockets.

There's no way around this, even trying to use the command line ping utility inside the Amazon Linux container the Lambda runs inside of won't work.

The annoyance of course is that this means anything you want to monitor needs to be running a webserver of some kind. It doesn't have to be a full-blown installation of Apache, you could use one of the many higher languages to make a one line web server or if you get really desperate, here's one in C code.

This sucks, I want better metrics

If you're really serious about your monitoring and metrics, you probably want to look at something like Smokeping which has much better stats and graphing for the purpose of packet loss and latency than this Lambda will ever be capable of with CloudWatch graphs.

Installation

  1. Install the AWS SAM CLI: https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/install-sam-cli.html
  2. Build the application:
    sam build
  3. Deploy the application:
    sam deploy --guided

Usage

To use the Lambda manually, invoke the Lambda with a JSON object defining the endpoints as an array:

sam remote invoke PingFunction --stack-name lambda-ping --event '["http://www.google.com", "https://www.jethrocarr.com"]'```The functionreturns a JSON object with the results. {"http://www.google.com": {"statusCode": 200,"durationMS": 169.88141500001075 },"https://www.jethrocarr.com": {"statusCode": 200,"durationMS": 6757.3228579999995 } }Generally you'll probably want to automatically ping the endpoints on a regularbasis. To do this, create a EventBridge schedule. This allows you to have completeflexibility over when and how frequently you execute your pings - for example,you might ping one endpoint every minute, whilst another might only need to beonce an hour.To do this, modify the `CloudWatch Event Configuration` section in `template.yaml`and then build and deploy the SAM package.```yaml... Events: ScheduledPing: Type: Schedule Properties: Schedule: rate(5 minutes) Input: '["https://www.jethrocarr.com", "https://www.google.com"]'

Or you can manually create a new scheduled event using Amazon EventBridge:

  1. Open the Amazon EventBridge console in AWS.
  2. Select EventBridgeSchedule
  3. Click Create rule.
  4. Set your desired schedule expression (e.g., rate(5 minutes) or a cron expression).
  5. Under Target, choose Lambda function.
  6. Select your Lambda function (e.g., ping-STAGE-http) from the dropdown.
  7. In the Configure input section, choose Constant (JSON text) and provide the array of endpoints to test on this schedule. For example: ["http://www.google.com", "http://github.com"]
  8. Complete the rule creation process.

You can create as many EventBridge rules as you want, on as many different schedules as you need. For cost efficiency, test as many endpoints as possible using the fewest rules, since all endpoints in a single rule are tested concurrently, reducing Lambda execution time.

You can create as many rules as you want, on as many different schedules as you want. Note that is is more cost effective to test as many endpoints using the fewest rules possible, since all endpoints in a single rule get tests concurrently reducing our Lambda's execution time.

Example CloudWatch Event

Contributions

All manner of contributions are welcome in the form of a Pull Request.

License

Copyright (c) 2025 Jethro Carr
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.

About

Check response code & latency of remote endpoints and graph in CloudWatch

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Repository files navigation

Modifications

  • reduce metrics, don't emit latency
  • improve the template with KMS, SNS, Alarms, Encryption, ...
  • change error code to 999

Lambda Ping

Lambda Ping is a small service which checks the HTTP response code and latency for one or more supplied endpoints. It returns this data both directly in the form of a JSON object that can be consumed by other applications, as well as saving the results to CloudWatch.

Because the data is in CloudWatch, you can use the results to trigger other events when an endpoint fails/recovers or performs too slowly by creating CloudWatch Alarms with the metrics recorded. For example, it becomes very easy to send alerts on endpoint health, trigger another Lambda or consume the alarm with another AWS service such as Route53 failover.

Cloudwatch Example

How it works

Once supplied with a JSON list of HTTP or HTTPS endpoints, this Lambda hits them concurrently and returns the status code and total query time. We take advantage of NodeJS's callback model to allow easy concurrent execution when running the tests, so the Lambda only runs for as long as it takes for the slowest query to complete. A max timeout of 10 seconds applies.

Why not ICMP?

Sadly there is no way to do ICMP pings from inside AWS Lambda currently - the main issue is that the container environment that Lambdas run inside of lacks the CAP_NET_RAW capability needed to allow an application to use raw sockets.

There's no way around this, even trying to use the command line ping utility inside the Amazon Linux container the Lambda runs inside of won't work.

The annoyance of course is that this means anything you want to monitor needs to be running a webserver of some kind. It doesn't have to be a full-blown installation of Apache, you could use one of the many higher languages to make a one line web server or if you get really desperate, here's one in C code.

This sucks, I want better metrics

If you're really serious about your monitoring and metrics, you probably want to look at something like Smokeping which has much better stats and graphing for the purpose of packet loss and latency than this Lambda will ever be capable of with CloudWatch graphs.

Installation

  1. Install the AWS SAM CLI: https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/install-sam-cli.html
  2. Build the application:
    sam build
  3. Deploy the application:
    sam deploy --guided

Usage

To use the Lambda manually, invoke the Lambda with a JSON object defining the endpoints as an array:

sam remote invoke PingFunction --stack-name lambda-ping --event '["http://www.google.com", "https://www.jethrocarr.com"]'```The functionreturns a JSON object with the results. {"http://www.google.com": {"statusCode": 200,"durationMS": 169.88141500001075 },"https://www.jethrocarr.com": {"statusCode": 200,"durationMS": 6757.3228579999995 } }Generally you'll probably want to automatically ping the endpoints on a regularbasis. To do this, create a EventBridge schedule. This allows you to have completeflexibility over when and how frequently you execute your pings - for example,you might ping one endpoint every minute, whilst another might only need to beonce an hour.To do this, modify the `CloudWatch Event Configuration` section in `template.yaml`and then build and deploy the SAM package.```yaml... Events: ScheduledPing: Type: Schedule Properties: Schedule: rate(5 minutes) Input: '["https://www.jethrocarr.com", "https://www.google.com"]'

Or you can manually create a new scheduled event using Amazon EventBridge:

  1. Open the Amazon EventBridge console in AWS.
  2. Select EventBridgeSchedule
  3. Click Create rule.
  4. Set your desired schedule expression (e.g., rate(5 minutes) or a cron expression).
  5. Under Target, choose Lambda function.
  6. Select your Lambda function (e.g., ping-STAGE-http) from the dropdown.
  7. In the Configure input section, choose Constant (JSON text) and provide the array of endpoints to test on this schedule. For example: ["http://www.google.com", "http://github.com"]
  8. Complete the rule creation process.

You can create as many EventBridge rules as you want, on as many different schedules as you need. For cost efficiency, test as many endpoints as possible using the fewest rules, since all endpoints in a single rule are tested concurrently, reducing Lambda execution time.

You can create as many rules as you want, on as many different schedules as you want. Note that is is more cost effective to test as many endpoints using the fewest rules possible, since all endpoints in a single rule get tests concurrently reducing our Lambda's execution time.

Example CloudWatch Event

Contributions

All manner of contributions are welcome in the form of a Pull Request.

License

Copyright (c) 2025 Jethro Carr
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.

About

Check response code & latency of remote endpoints and graph in CloudWatch

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Modifications

  • reduce metrics, don't emit latency
  • improve the template with KMS, SNS, Alarms, Encryption, ...
  • change error code to 999

Lambda Ping

Lambda Ping is a small service which checks the HTTP response code and latency for one or more supplied endpoints. It returns this data both directly in the form of a JSON object that can be consumed by other applications, as well as saving the results to CloudWatch.

Because the data is in CloudWatch, you can use the results to trigger other events when an endpoint fails/recovers or performs too slowly by creating CloudWatch Alarms with the metrics recorded. For example, it becomes very easy to send alerts on endpoint health, trigger another Lambda or consume the alarm with another AWS service such as Route53 failover.

Cloudwatch Example

How it works

Once supplied with a JSON list of HTTP or HTTPS endpoints, this Lambda hits them concurrently and returns the status code and total query time. We take advantage of NodeJS's callback model to allow easy concurrent execution when running the tests, so the Lambda only runs for as long as it takes for the slowest query to complete. A max timeout of 10 seconds applies.

Why not ICMP?

Sadly there is no way to do ICMP pings from inside AWS Lambda currently - the main issue is that the container environment that Lambdas run inside of lacks the CAP_NET_RAW capability needed to allow an application to use raw sockets.

There's no way around this, even trying to use the command line ping utility inside the Amazon Linux container the Lambda runs inside of won't work.

The annoyance of course is that this means anything you want to monitor needs to be running a webserver of some kind. It doesn't have to be a full-blown installation of Apache, you could use one of the many higher languages to make a one line web server or if you get really desperate, here's one in C code.

This sucks, I want better metrics

If you're really serious about your monitoring and metrics, you probably want to look at something like Smokeping which has much better stats and graphing for the purpose of packet loss and latency than this Lambda will ever be capable of with CloudWatch graphs.

Installation

  1. Install the AWS SAM CLI: https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/install-sam-cli.html
  2. Build the application:
    sam build
  3. Deploy the application:
    sam deploy --guided

Usage

To use the Lambda manually, invoke the Lambda with a JSON object defining the endpoints as an array:

sam remote invoke PingFunction --stack-name lambda-ping --event '["http://www.google.com", "https://www.jethrocarr.com"]'```The functionreturns a JSON object with the results. {"http://www.google.com": {"statusCode": 200,"durationMS": 169.88141500001075 },"https://www.jethrocarr.com": {"statusCode": 200,"durationMS": 6757.3228579999995 } }Generally you'll probably want to automatically ping the endpoints on a regularbasis. To do this, create a EventBridge schedule. This allows you to have completeflexibility over when and how frequently you execute your pings - for example,you might ping one endpoint every minute, whilst another might only need to beonce an hour.To do this, modify the `CloudWatch Event Configuration` section in `template.yaml`and then build and deploy the SAM package.```yaml... Events: ScheduledPing: Type: Schedule Properties: Schedule: rate(5 minutes) Input: '["https://www.jethrocarr.com", "https://www.google.com"]'

Or you can manually create a new scheduled event using Amazon EventBridge:

  1. Open the Amazon EventBridge console in AWS.
  2. Select EventBridgeSchedule
  3. Click Create rule.
  4. Set your desired schedule expression (e.g., rate(5 minutes) or a cron expression).
  5. Under Target, choose Lambda function.
  6. Select your Lambda function (e.g., ping-STAGE-http) from the dropdown.
  7. In the Configure input section, choose Constant (JSON text) and provide the array of endpoints to test on this schedule. For example: ["http://www.google.com", "http://github.com"]
  8. Complete the rule creation process.

You can create as many EventBridge rules as you want, on as many different schedules as you need. For cost efficiency, test as many endpoints as possible using the fewest rules, since all endpoints in a single rule are tested concurrently, reducing Lambda execution time.

You can create as many rules as you want, on as many different schedules as you want. Note that is is more cost effective to test as many endpoints using the fewest rules possible, since all endpoints in a single rule get tests concurrently reducing our Lambda's execution time.

Example CloudWatch Event

Contributions

All manner of contributions are welcome in the form of a Pull Request.

License

Copyright (c) 2025 Jethro Carr
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.

About

Check response code & latency of remote endpoints and graph in CloudWatch

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Modifications

  • reduce metrics, don't emit latency
  • improve the template with KMS, SNS, Alarms, Encryption, ...
  • change error code to 999

Lambda Ping

Lambda Ping is a small service which checks the HTTP response code and latency for one or more supplied endpoints. It returns this data both directly in the form of a JSON object that can be consumed by other applications, as well as saving the results to CloudWatch.

Because the data is in CloudWatch, you can use the results to trigger other events when an endpoint fails/recovers or performs too slowly by creating CloudWatch Alarms with the metrics recorded. For example, it becomes very easy to send alerts on endpoint health, trigger another Lambda or consume the alarm with another AWS service such as Route53 failover.

Cloudwatch Example

How it works

Once supplied with a JSON list of HTTP or HTTPS endpoints, this Lambda hits them concurrently and returns the status code and total query time. We take advantage of NodeJS's callback model to allow easy concurrent execution when running the tests, so the Lambda only runs for as long as it takes for the slowest query to complete. A max timeout of 10 seconds applies.

Why not ICMP?

Sadly there is no way to do ICMP pings from inside AWS Lambda currently - the main issue is that the container environment that Lambdas run inside of lacks the CAP_NET_RAW capability needed to allow an application to use raw sockets.

There's no way around this, even trying to use the command line ping utility inside the Amazon Linux container the Lambda runs inside of won't work.

The annoyance of course is that this means anything you want to monitor needs to be running a webserver of some kind. It doesn't have to be a full-blown installation of Apache, you could use one of the many higher languages to make a one line web server or if you get really desperate, here's one in C code.

This sucks, I want better metrics

If you're really serious about your monitoring and metrics, you probably want to look at something like Smokeping which has much better stats and graphing for the purpose of packet loss and latency than this Lambda will ever be capable of with CloudWatch graphs.

Installation

  1. Install the AWS SAM CLI: https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/install-sam-cli.html
  2. Build the application:
    sam build
  3. Deploy the application:
    sam deploy --guided

Usage

To use the Lambda manually, invoke the Lambda with a JSON object defining the endpoints as an array:

sam remote invoke PingFunction --stack-name lambda-ping --event '["http://www.google.com", "https://www.jethrocarr.com"]'```The functionreturns a JSON object with the results. {"http://www.google.com": {"statusCode": 200,"durationMS": 169.88141500001075 },"https://www.jethrocarr.com": {"statusCode": 200,"durationMS": 6757.3228579999995 } }Generally you'll probably want to automatically ping the endpoints on a regularbasis. To do this, create a EventBridge schedule. This allows you to have completeflexibility over when and how frequently you execute your pings - for example,you might ping one endpoint every minute, whilst another might only need to beonce an hour.To do this, modify the `CloudWatch Event Configuration` section in `template.yaml`and then build and deploy the SAM package.```yaml... Events: ScheduledPing: Type: Schedule Properties: Schedule: rate(5 minutes) Input: '["https://www.jethrocarr.com", "https://www.google.com"]'

Or you can manually create a new scheduled event using Amazon EventBridge:

  1. Open the Amazon EventBridge console in AWS.
  2. Select EventBridgeSchedule
  3. Click Create rule.
  4. Set your desired schedule expression (e.g., rate(5 minutes) or a cron expression).
  5. Under Target, choose Lambda function.
  6. Select your Lambda function (e.g., ping-STAGE-http) from the dropdown.
  7. In the Configure input section, choose Constant (JSON text) and provide the array of endpoints to test on this schedule. For example: ["http://www.google.com", "http://github.com"]
  8. Complete the rule creation process.

You can create as many EventBridge rules as you want, on as many different schedules as you need. For cost efficiency, test as many endpoints as possible using the fewest rules, since all endpoints in a single rule are tested concurrently, reducing Lambda execution time.

You can create as many rules as you want, on as many different schedules as you want. Note that is is more cost effective to test as many endpoints using the fewest rules possible, since all endpoints in a single rule get tests concurrently reducing our Lambda's execution time.

Example CloudWatch Event

Contributions

All manner of contributions are welcome in the form of a Pull Request.

License

Copyright (c) 2025 Jethro Carr
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.

About

Check response code & latency of remote endpoints and graph in CloudWatch

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Repository files navigation

Modifications

  • reduce metrics, don't emit latency
  • improve the template with KMS, SNS, Alarms, Encryption, ...
  • change error code to 999

Lambda Ping

Lambda Ping is a small service which checks the HTTP response code and latency for one or more supplied endpoints. It returns this data both directly in the form of a JSON object that can be consumed by other applications, as well as saving the results to CloudWatch.

Because the data is in CloudWatch, you can use the results to trigger other events when an endpoint fails/recovers or performs too slowly by creating CloudWatch Alarms with the metrics recorded. For example, it becomes very easy to send alerts on endpoint health, trigger another Lambda or consume the alarm with another AWS service such as Route53 failover.

Cloudwatch Example

How it works

Once supplied with a JSON list of HTTP or HTTPS endpoints, this Lambda hits them concurrently and returns the status code and total query time. We take advantage of NodeJS's callback model to allow easy concurrent execution when running the tests, so the Lambda only runs for as long as it takes for the slowest query to complete. A max timeout of 10 seconds applies.

Why not ICMP?

Sadly there is no way to do ICMP pings from inside AWS Lambda currently - the main issue is that the container environment that Lambdas run inside of lacks the CAP_NET_RAW capability needed to allow an application to use raw sockets.

There's no way around this, even trying to use the command line ping utility inside the Amazon Linux container the Lambda runs inside of won't work.

The annoyance of course is that this means anything you want to monitor needs to be running a webserver of some kind. It doesn't have to be a full-blown installation of Apache, you could use one of the many higher languages to make a one line web server or if you get really desperate, here's one in C code.

This sucks, I want better metrics

If you're really serious about your monitoring and metrics, you probably want to look at something like Smokeping which has much better stats and graphing for the purpose of packet loss and latency than this Lambda will ever be capable of with CloudWatch graphs.

Installation

  1. Install the AWS SAM CLI: https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/install-sam-cli.html
  2. Build the application:
    sam build
  3. Deploy the application:
    sam deploy --guided

Usage

To use the Lambda manually, invoke the Lambda with a JSON object defining the endpoints as an array:

sam remote invoke PingFunction --stack-name lambda-ping --event '["http://www.google.com", "https://www.jethrocarr.com"]'```The functionreturns a JSON object with the results. {"http://www.google.com": {"statusCode": 200,"durationMS": 169.88141500001075 },"https://www.jethrocarr.com": {"statusCode": 200,"durationMS": 6757.3228579999995 } }Generally you'll probably want to automatically ping the endpoints on a regularbasis. To do this, create a EventBridge schedule. This allows you to have completeflexibility over when and how frequently you execute your pings - for example,you might ping one endpoint every minute, whilst another might only need to beonce an hour.To do this, modify the `CloudWatch Event Configuration` section in `template.yaml`and then build and deploy the SAM package.```yaml... Events: ScheduledPing: Type: Schedule Properties: Schedule: rate(5 minutes) Input: '["https://www.jethrocarr.com", "https://www.google.com"]'

Or you can manually create a new scheduled event using Amazon EventBridge:

  1. Open the Amazon EventBridge console in AWS.
  2. Select EventBridgeSchedule
  3. Click Create rule.
  4. Set your desired schedule expression (e.g., rate(5 minutes) or a cron expression).
  5. Under Target, choose Lambda function.
  6. Select your Lambda function (e.g., ping-STAGE-http) from the dropdown.
  7. In the Configure input section, choose Constant (JSON text) and provide the array of endpoints to test on this schedule. For example: ["http://www.google.com", "http://github.com"]
  8. Complete the rule creation process.

You can create as many EventBridge rules as you want, on as many different schedules as you need. For cost efficiency, test as many endpoints as possible using the fewest rules, since all endpoints in a single rule are tested concurrently, reducing Lambda execution time.

You can create as many rules as you want, on as many different schedules as you want. Note that is is more cost effective to test as many endpoints using the fewest rules possible, since all endpoints in a single rule get tests concurrently reducing our Lambda's execution time.

Example CloudWatch Event

Contributions

All manner of contributions are welcome in the form of a Pull Request.

License

Copyright (c) 2025 Jethro Carr
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.

About

Check response code & latency of remote endpoints and graph in CloudWatch

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages