|
| 1 | +title: Application Performance Monitoring AWS Lambda Functions with Sentry |
| 2 | +slug: application-performance-monitoring-aws-lambda-functions-sentry |
| 3 | +meta: Learn how to use Sentry Application Performance Monitoring on AWS Lambda. |
| 4 | +category: post |
| 5 | +date: 2021-08-23 |
| 6 | +modified: 2021-08-25 |
| 7 | +newsletter: False |
| 8 | +headerimage: /img/headers/python-lambda-sentry.jpg |
| 9 | +headeralt: The Python, AWS Lambda and Sentry logos are copyright their respective owners. |
| 10 | + |
| 11 | + |
| 12 | +[Amazon Web Services (AWS) Lambda](/aws-lambda.html) is a usage-based |
| 13 | +computing infrastructure service that can execute |
| 14 | +[Python 3](/why-use-python.html) code. One of the challenges of this |
| 15 | +environment is ensuring efficient performance of your Lambda Functions. |
| 16 | +Application performance monitoring (APM) is particularly useful in these |
| 17 | +situations because you are billed based on how long you use the |
| 18 | +resources. |
| 19 | + |
| 20 | +In this post we will install and configure |
| 21 | +[Sentry's APM](https://sentry.io/for/performance/) that works via a |
| 22 | +[Lambda layer](https://docs.aws.amazon.com/lambda/latest/dg/invocation-layers.html). |
| 23 | +Note that if you are looking for error monitoring rather than performance |
| 24 | +monitoring, take a look at |
| 25 | +[How to Monitor Python Functions on AWS Lambda with Sentry](/blog/monitor-python-functions-aws-lambda-sentry.html) |
| 26 | +rather than following this post. |
| 27 | + |
| 28 | + |
| 29 | +## First steps with AWS Lambda |
| 30 | +A local [development environment](/development-environments.html) is not |
| 31 | +required to follow this tutorial because all of the coding and configuration |
| 32 | +can happen in a web browser through the |
| 33 | +[AWS Console](https://console.aws.amazon.com/console/). |
| 34 | + |
| 35 | +[Sign into your existing AWS account](https://aws.amazon.com/console) |
| 36 | +or sign up for a [new account](https://aws.amazon.com/). Lambda |
| 37 | +gives you the first 1 million requests for free so that you can execute |
| 38 | +basic applications without no or low cost. |
| 39 | + |
| 40 | +<img src="/img/210406-python-sentry-aws-lambda/aws-lambda-landing.jpg" width="100%" class="shot rnd outl" alt="The AWS Lambda landing page."> |
| 41 | + |
| 42 | +When you log into your account, use the search box to enter |
| 43 | +"lambda" and select "Lambda" when it appears to get to the right |
| 44 | +page. |
| 45 | + |
| 46 | +<img src="/img/210406-python-sentry-aws-lambda/lambda-search-bar.png" width="100%" class="shot rnd outl" alt="Use the search bar to find AWS Lambda."> |
| 47 | + |
| 48 | +If you have already used Lambda before, you will see your existing Lambda |
| 49 | +functions in a searchable table. We're going to create a new function so |
| 50 | +click the "Create function" button. |
| 51 | + |
| 52 | +<img src="/img/210406-python-sentry-aws-lambda/create-function.png" width="100%" class="shot rnd outl" alt="Click the create function button."> |
| 53 | + |
| 54 | +The create function page will give you several options for building a |
| 55 | +Lambda function. |
| 56 | + |
| 57 | +<img src="/img/210406-python-sentry-aws-lambda/create-function-detail.png" width="100%" class="shot rnd outl" alt="The create function details page."> |
| 58 | + |
| 59 | +Click the "Browse Serverless App Repository" selection box, then choose |
| 60 | +the "hello-world-python3" starter app from within the |
| 61 | +"Public applications" section. |
| 62 | + |
| 63 | +<img src="/img/210406-python-sentry-aws-lambda/create-function-detail.png" width="100%" class="shot rnd outl" alt="The create function details page."> |
| 64 | + |
| 65 | +The hello-world-python3 starter app details page should look something |
| 66 | +like the following screen: |
| 67 | + |
| 68 | +<img src="/img/210406-python-sentry-aws-lambda/hello-world-python3.png" width="100%" class="shot rnd outl" alt="Hello world Python3 example app and Lambda function."> |
| 69 | + |
| 70 | +Fill in some example text such as "test" under `IdentityNameParameter` |
| 71 | +and click the "Deploy" button: |
| 72 | + |
| 73 | +<img src="/img/210406-python-sentry-aws-lambda/deploy-starter-app.png" width="100%" class="shot rnd outl" alt="Click the deploy button to use the starter app."> |
| 74 | + |
| 75 | +The function will now be deployed. As soon as it is ready we can |
| 76 | +customize it and test it out before adding Sentry to capture any errors |
| 77 | +that occur during execution. |
| 78 | + |
| 79 | +Go back to the Lambda functions main page and select your new deployed |
| 80 | +starter app from the list. |
| 81 | + |
| 82 | +<img src="/img/210406-python-sentry-aws-lambda/functions-list.jpg" width="100%" class="shot rnd outl" alt="List of AWS Lambda functions you have created."> |
| 83 | + |
| 84 | +Find the orange "Test" button with a down arrow next to it like you |
| 85 | +see in the image below, and then click the down arrow. Select |
| 86 | +"Configure Test Event". |
| 87 | + |
| 88 | +<img src="/img/210406-python-sentry-aws-lambda/configure-test.jpg" width="100%" class="shot rnd outl" alt="Configure the test event."> |
| 89 | + |
| 90 | +Fill in the Event name as "FirstTest" or something similar, then |
| 91 | +press the "Create" button at the bottom of the modal window. |
| 92 | + |
| 93 | +Click the "Test" button and it will run the Lambda function with |
| 94 | +the parameters from that new test event. You should see something |
| 95 | +like the following output: |
| 96 | + |
| 97 | +```python |
| 98 | +Response |
| 99 | +"value1" |
| 100 | + |
| 101 | +Function Logs |
| 102 | +START RequestId: 62fa2f25-669c-47b7-b4e7-47353b0bd914 Version: $LATEST |
| 103 | +value1 = value1 |
| 104 | +value2 = value2 |
| 105 | +value3 = value3 |
| 106 | +END RequestId: 62fa2f25-669c-47b7-b4e7-47353b0bd914 |
| 107 | +REPORT RequestId: 62fa2f25-669c-47b7-b4e7-47353b0bd914 Duration: 0.30 ms Billed Duration: 1 ms Memory Size: 128 MB Max Memory Used: 43 MB Init Duration: 1.34 ms |
| 108 | + |
| 109 | +Request ID |
| 110 | +62fa2f25-669c-47b7-b4e7-47353b0bd914 |
| 111 | +``` |
| 112 | + |
| 113 | +The code was successfully executed, so let's add Sentry's performance |
| 114 | +monitoring and test some code that uses it. |
| 115 | + |
| 116 | + |
| 117 | +## Performance monitoring with Sentry |
| 118 | +Go to [Sentry.io's homepage](https://sentry.io). |
| 119 | + |
| 120 | +<img src="/img/210406-python-sentry-aws-lambda/sentry-homepage.jpg" width="100%" class="shot rnd outl" alt="Sentry.io homepage where you can sign up for a free account."> |
| 121 | + |
| 122 | +Sign into your account or sign up for a new free account. You will be at |
| 123 | +the main account dashboard after logging in or completing the Sentry sign |
| 124 | +up process. |
| 125 | + |
| 126 | +Select "Performance" on the left navigation bar, it will take you to the |
| 127 | +performance monitoring page. |
| 128 | + |
| 129 | +<img src="/img/210823-sentry-apm-lambda/performance.jpg" width="100%" class="shot rnd outl" alt="Click the 'performance' button on the left side nav."> |
| 130 | + |
| 131 | +Click "Start Setup" then go back over to AWS Lambda to complete the |
| 132 | +steps for adding Sentry's Python layer to your Lambda function. |
| 133 | + |
| 134 | +The easiest way to add Sentry to Lambda for this application |
| 135 | +is to configure an |
| 136 | +[AWS Lambda Layer](https://docs.aws.amazon.com/lambda/latest/dg/configuration-layers.html) |
| 137 | +with the necessary dependency for Sentry. Sentry has concise |
| 138 | +[documentation on adding via Lambda Layers](https://docs.sentry.io/platforms/python/guides/aws-lambda/layer/) |
| 139 | +so we will walk through that way to configure it and test it |
| 140 | +out. |
| 141 | + |
| 142 | +Scroll down to the "Layers" section while in your Lambda |
| 143 | +function configuration. Click the "Add a layer" button": |
| 144 | + |
| 145 | +<img src="/img/210406-python-sentry-aws-lambda/add-lambda-layer.png" width="100%" class="shot rnd outl" alt="Add Lambda layer."> |
| 146 | + |
| 147 | +In the "Add layer" screen, select the "Specify an ARN" option. |
| 148 | + |
| 149 | +<img src="/img/210406-python-sentry-aws-lambda/add-layer-specify-arn.jpg" width="100%" class="shot rnd outl" alt="Select Specify ARN in the Add Layer screen."> |
| 150 | + |
| 151 | +Now to specify the Amazon Resource Name (ARN), we need to use |
| 152 | +the Sentry documentation to get the right configuration string. |
| 153 | + |
| 154 | +US-East-1 is the oldest and most commonly-used region so I'll |
| 155 | +use that here in this tutorial but you should check which one |
| 156 | +you are in if you are not certain. |
| 157 | + |
| 158 | +<img src="/img/210823-sentry-apm-lambda/arn-region.png" width="100%" class="shot rnd outl" alt="Select the AWS for the ARN string."> |
| 159 | + |
| 160 | +Copy that value into the Lambda Layer configuration, like this: |
| 161 | + |
| 162 | +<img src="/img/210823-sentry-apm-lambda/layer-with-arn.png" width="100%" class="shot rnd outl" alt="Select the AWS for the ARN string."> |
| 163 | + |
| 164 | +Then press the "Add" button. You now have the Sentry dependency |
| 165 | +in your environment so code that relies upon that library can be |
| 166 | +used in the Lambda function. |
| 167 | + |
| 168 | + |
| 169 | +## Testing performance monitoring |
| 170 | +Let's change our Python code in the Lambda function and test out |
| 171 | +the APM agent. |
| 172 | + |
| 173 | +Make sure you are signed into your Sentry account and go to |
| 174 | +[this specific AWS Lambda set up guide](https://docs.sentry.io/platforms/python/guides/aws-lambda/). |
| 175 | + |
| 176 | +You will see a "DSN string" that we need to set as an environment |
| 177 | +variable on AWS Lambda to finish our setup. Copy the string that |
| 178 | +matches your project as shown on that page in the highlighted green |
| 179 | +section: |
| 180 | + |
| 181 | +<img src="/img/210823-sentry-apm-lambda//sentry-dsn-string.png" width="100%" class="shot rnd outl" alt="Copy the Sentry DSN string so we can export it as an environment variable."> |
| 182 | + |
| 183 | +We will |
| 184 | +[use environment variables on AWS Lambda](https://docs.aws.amazon.com/lambda/latest/dg/configuration-envvars.html) |
| 185 | +to store and access values like this Sentry DSN key. |
| 186 | + |
| 187 | +Go into the Lambda console to create a new environment variable. To do |
| 188 | +that, click the "Configuration" tab within Lambda like you see here: |
| 189 | + |
| 190 | +<img src="/img/210406-python-sentry-aws-lambda/aws-lambda-configuration.jpg" width="100%" class="shot rnd outl" alt="Click the Lambda Configuration tab."> |
| 191 | + |
| 192 | +Then click "Edit" and add a new environment variable with the key of `SENTRY_DSN` |
| 193 | +and the value of the DSN string that you copied from the Sentry screen. |
| 194 | + |
| 195 | +<img src="/img/210406-python-sentry-aws-lambda/add-env-var.jpg" width="100%" class="shot rnd outl" alt="Add the environment variable in AWS Lambda."> |
| 196 | + |
| 197 | +Click the "Save" button and go back to your Lambda function code. |
| 198 | + |
| 199 | +Update your Lambda function with the following highlighted new lines of code |
| 200 | +to send errors to Sentry. |
| 201 | + |
| 202 | +```python |
| 203 | +import json |
| 204 | +import os |
| 205 | +import sentry_sdk |
| 206 | +import time |
| 207 | +from sentry_sdk.integrations.aws_lambda import AwsLambdaIntegration |
| 208 | +from sentry_sdk import start_transaction |
| 209 | + |
| 210 | +SENTRY_DSN = os.environ.get('SENTRY_DSN') |
| 211 | +sentry_sdk.init( |
| 212 | + dsn=SENTRY_DSN, |
| 213 | + traces_sample_rate=1.0, |
| 214 | + integrations=[AwsLambdaIntegration()] |
| 215 | +) |
| 216 | + |
| 217 | +print('Loading function') |
| 218 | + |
| 219 | + |
| 220 | +def lambda_handler(event, context): |
| 221 | + calc = 1000 |
| 222 | + |
| 223 | + # this is custom instrumentation, see docs: https://bit.ly/2WjT3AY |
| 224 | + with start_transaction(op="task", name="big calculation"): |
| 225 | + for i in range(1, 1000): |
| 226 | + calc = calc * i |
| 227 | + |
| 228 | + print(calc) |
| 229 | + return event['key1'] # Echo back the first key value |
| 230 | +``` |
| 231 | + |
| 232 | +The above code imports the Sentry dependencies, and then runs both |
| 233 | +[automatic instrumentation](https://docs.sentry.io/platforms/python/guides/aws-lambda/performance/instrumentation/automatic-instrumentation/) |
| 234 | +and [custom instrumentation](https://bit.ly/2WjT3AY) on the |
| 235 | +code. Click the "Deploy" button and then "Test". The code will |
| 236 | +successfully execute and when we go back to our Sentry performance |
| 237 | +monitoring dashboard we will see some initial results, like this |
| 238 | +following screenshot. |
| 239 | + |
| 240 | +<img src="/img/210823-sentry-apm-lambda/performance-results.jpg" width="100%" class="shot rnd outl" alt="APM results shown in the Sentry dashboard."> |
| 241 | + |
| 242 | +Looks good, you have both the default and the specified transaction |
| 243 | +performance recordings in the dashboard, and you can toggle between |
| 244 | +them (or other transactions you record) through the user interface. |
| 245 | + |
| 246 | + |
| 247 | +## What's Next? |
| 248 | +We just wrote and executed a Python 3 function on AWS Lambda that |
| 249 | +used the basics of Sentry APM to get some initial performance |
| 250 | +monitoring data. |
| 251 | + |
| 252 | +Check out the [AWS Lambda section](/aws-lambda.html) for |
| 253 | +more tutorials by other developers. |
| 254 | + |
| 255 | +Further questions? Contact me on Twitter |
| 256 | +[@fullstackpython](https://twitter.com/fullstackpython) |
| 257 | +or [@mattmakai](https://twitter.com/mattmakai). I am also on GitHub with |
| 258 | +the username [mattmakai](https://github.com/mattmakai). |
| 259 | + |
| 260 | +Something wrong with this post? Fork |
| 261 | +[this page's source on GitHub](https://github.com/mattmakai/fullstackpython.com/blob/master/content/posts/210823-performance-monitoring-aws-lambda-sentry.markdown) |
| 262 | +and submit a pull request. |
0 commit comments