<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
    <channel>
        <title>Elastic Observability Labs - Articles by Akhilesh Pokhariyal</title>
        <link>https://www.elastic.co/observability-labs</link>
        <description>Trusted security news &amp; research from the team at Elastic.</description>
        <lastBuildDate>Thu, 14 May 2026 16:08:29 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>Elastic Observability Labs - Articles by Akhilesh Pokhariyal</title>
            <url>https://www.elastic.co/observability-labs/assets/observability-labs-thumbnail.png</url>
            <link>https://www.elastic.co/observability-labs</link>
        </image>
        <copyright>© 2026. Elasticsearch B.V. All Rights Reserved</copyright>
        <item>
            <title><![CDATA[One-Step Ingest for CloudWatch Logs and Metrics into Elastic Observability with Amazon Data Firehose]]></title>
            <link>https://www.elastic.co/observability-labs/blog/aws-data-firehose-onboarding</link>
            <guid isPermaLink="false">aws-data-firehose-onboarding</guid>
            <pubDate>Tue, 26 Nov 2024 00:00:00 GMT</pubDate>
            <description><![CDATA[AWS users can now leverage the new guided onboarding workflow to ingest CloudWatch logs and metrics in Elastic Cloud and explore the usage and performance of over twenty AWS services within minutes, using the provided CloudFormation template.]]></description>
            <content:encoded><![CDATA[<h2>Overview of the new Quickstart guided workflow</h2>
<p>Elastic Observability has been supporting AWS logs ingest with Amazon Data Firehose over the last few releases. To makes configuration easier, we introduced, in 8.16, a one step guided workflow to onboard all CloudWatch logs and metrics from a single region. The configuration uses a pre-populated CloudFormation template, to automatically create a Amazon Data Firehose and connect to Elastic Observability. Additionally, all the relevant Elastic AWS Integrations are auto-installed. The configuration ensures ingestion for metrics from all namespaces and a policy to ingest logs from all existing log groups. Any new metric namespaces and log groups post setup will also be ingested automatically. Additionally, the CloudFormation template can also be customized and deployed in a production environment using infra-as-code.</p>
<p>This allows SREs to to start monitoring the usage and health of their popular AWS services using pre-built dashboards within minutes. This blog reviews how to setup this quickstart workflow, and the out-of-the box dashboards that will be populated from it.</p>
<h2>Onboarding data using Amazon Data Firehose</h2>
<p>In order to utilize this guided workflow, a user needs the superuser built-in Kibana role. A deployment of the hosted Elasticsearch service of version 8.16 on <a href="https://cloud.elastic.co/login?redirectTo=%2Fhome">Elastic Cloud</a> is required. Further, an active AWS account and the necessary permissions to create delivery streams, run CloudFormation, create CloudWatch log group/metric streams are needed.</p>
<p>Let’s walk through the steps required to onboard data using this workflow. There should be some CloudWatch logs and metrics already available in the customer account. The screenshot below shows an example where a number of CloudWatch metrics namespaces already exist.</p>
<p><img src="https://www.elastic.co/observability-labs/assets/images/aws-data-firehose-onboarding/AWS-CloudWatch-Metrics.png" alt="CloudWatch metrics already present" /></p>
<p>Similarly, a number of CloudWatch log groups are already present in this customer account as shown below.</p>
<p><img src="https://www.elastic.co/observability-labs/assets/images/aws-data-firehose-onboarding/AWS-CloudWatch-Log-Groups.png" alt="CloudWatch logs already present" /></p>
<p>This guided workflow is accessible from the ‘Add data’ left navigation option in the Elastic Observability app. The user needs to select the ‘Cloud’ option and click on the ‘AWS’ tile. The Amazon Firehose quickstart onboarding workflow is available at the top left and is labeled as a Quickstart option, as shown below.  </p>
<p><img src="https://www.elastic.co/observability-labs/assets/images/aws-data-firehose-onboarding/Kibana-Onboarding-Firehose-Card.png" alt="Firehose onboarding tile" /></p>
<p>The Data Firehose delivery stream can be created either using the AWS CLI or the AWS console, as shown in step 2 of the guided workflow below. </p>
<p><img src="https://www.elastic.co/observability-labs/assets/images/aws-data-firehose-onboarding/Kibana-Firehose-Flow-Start.png" alt="Firehose onboarding step 1" /></p>
<p>By clicking on the ‘Create Firehose Stream in AWS’ button under the ‘Via AWS Console’ tab, the user will be taken to the AWS console and the menu for creating the CloudFormation stack, as shown below. </p>
<p><img src="https://www.elastic.co/observability-labs/assets/images/aws-data-firehose-onboarding/AWS-CloudFormation-Template-Form-1.png" alt="Firehose onboarding aws console" /></p>
<p>The CloudFormation (CF) template provided by Elastic has prepopulated default settings including the Elasticsearch endpoint and the API key, as shown in the screenshot above. The user can review these defaults in the AWS console and proceed by clicking on the ‘Create stack’ button, as shown below. Note that this stack creates IAM resources and so the checkbox acknowledging that must be checked to move forward. </p>
<p><img src="https://www.elastic.co/observability-labs/assets/images/aws-data-firehose-onboarding/AWS-CloudFormation-Template-Form-2.png" alt="CF template 2" /></p>
<p><img src="https://www.elastic.co/observability-labs/assets/images/aws-data-firehose-onboarding/CloudFormation-Template-Complete.png" alt="CF template complete" /></p>
<p>Once the CloudFormation stack has been created in AWS, the user can switch back to Kibana. By default, the CF stack will consist of separate delivery streams for CloudWatch logs and metrics, as shown below. </p>
<p><img src="https://www.elastic.co/observability-labs/assets/images/aws-data-firehose-onboarding/Firehose-Streams.png" alt="Firehose streams" /></p>
<p>In Kibana, under step 3 ‘Visualize your data’ of the workflow, the incoming data starts to appear, categorized by AWS service type as shown below. The page refreshes automatically every 5 s and the new services appear at the bottom of the list.  </p>
<p><img src="https://www.elastic.co/observability-labs/assets/images/aws-data-firehose-onboarding/Kibana-AWS-Services-Detected-1.png" alt="Services detected 01" /></p>
<p><img src="https://www.elastic.co/observability-labs/assets/images/aws-data-firehose-onboarding/Kibana-AWS-Services-Detected-2.png" alt="Services detected 02" /></p>
<p>For each detected AWS service, the user is recommended 1-2 pre-built dashboards to explore the health and usage of their services. For example, the pre-built dashboard shown below provides a quick overview on the usage of the NAT Gateway.  </p>
<p><img src="https://www.elastic.co/observability-labs/assets/images/aws-data-firehose-onboarding/NAT-Gateway-Dashboard.png" alt="Nat Gateway dashboard" /></p>
<p>In addition to pre-built dashboards, Discover can also be used to explore the ingested CloudWatch logs, as shown below. </p>
<p><img src="https://www.elastic.co/observability-labs/assets/images/aws-data-firehose-onboarding/ECS-Logs.png" alt="Discover for logs" /></p>
<p>AWS Usage overview can be explored using the pre-built dashboard shown below.</p>
<p><img src="https://www.elastic.co/observability-labs/assets/images/aws-data-firehose-onboarding/AWS-Usage-Dashboard.png" alt="AWS usage" /></p>
<h2>Customisation options</h2>
<p>The region needs to be selected/modified in the AWS console as shown below, before starting with the CF stack creation. </p>
<p><img src="https://www.elastic.co/observability-labs/assets/images/aws-data-firehose-onboarding/AWS-Console-Region-Selector.png" alt="AWS region selector" /></p>
<p>The setting of <code>EnableCloudWatchLogs</code> parameter and the setting of <code>EnableCloudWatchMetrics</code> parameter in the AWS console or the CF template can be changed to disable the collection of logs or metrics.</p>
<p>The <code>MetricNameFilters</code> parameter in the CF template or console can be used to exclude specific namespace-metric names pairs from collection.</p>
<p>The CF template provided by Elastic can be used together with the Terraform resource <a href="https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/cloudformation_stack">aws_cloudformation_stack</a> as shown below to deploy in the production environment, to facilitate as-code deployment.</p>
<p><img src="https://www.elastic.co/observability-labs/assets/images/aws-data-firehose-onboarding/Terraform-Template.png" alt="Terraform template" /></p>
<h2>Start your own exploration </h2>
<p>The new guided onboarding workflow for AWS utilizes the Amazon Firehose delivery stream to collect all available CloudWatch logs &amp; metrics, from a single customer account and a single region. The workflow also installs AWS Integration packages in the Elastic stack, enabling users to start monitoring the usage and performance of their common AWS services using pre-built dashboards, within minutes. Some of the AWS services that can be monitored using this workflow are listed below. A complete list of over twenty services that are supported by this workflow along with additional details are available <a href="https://www.elastic.co/guide/en/observability/current/collect-data-with-aws-firehose.html">here</a>.</p>
<table>
<thead>
<tr>
<th></th>
<th></th>
</tr>
</thead>
<tbody>
<tr>
<td>VPC Flow Logs</td>
<td>Logs</td>
</tr>
<tr>
<td>API Gateway</td>
<td>Logs, Metrics</td>
</tr>
<tr>
<td>CloudTrail</td>
<td>Logs</td>
</tr>
<tr>
<td>Network Firewall</td>
<td>Logs, Metrics</td>
</tr>
<tr>
<td>WAF</td>
<td>Logs</td>
</tr>
<tr>
<td>EC2</td>
<td>Metrics</td>
</tr>
<tr>
<td>RDS</td>
<td>Metrics</td>
</tr>
</tbody>
</table>
]]></content:encoded>
            <category>observability-labs</category>
            <enclosure url="https://www.elastic.co/observability-labs/assets/images/aws-data-firehose-onboarding/154567_Image 21.jpg" length="0" type="image/jpg"/>
        </item>
        <item>
            <title><![CDATA[Elastic APM for iOS and Android Native apps]]></title>
            <link>https://www.elastic.co/observability-labs/blog/apm-ios-android-native-apps</link>
            <guid isPermaLink="false">apm-ios-android-native-apps</guid>
            <pubDate>Thu, 08 Feb 2024 00:00:00 GMT</pubDate>
            <description><![CDATA[This blog provides an overview of the key capabilities included in the Elastic APM solution for iOS and Android native apps, as well as a walkthrough of the configuration details and troubleshooting workflow for a few error scenarios.]]></description>
            <content:encoded><![CDATA[<blockquote>
<p><strong>WARNING</strong>: This article shows information about the Android agent that is no longer accurate for versions <code>1.x</code>. Please refer to <a href="https://www.elastic.co/docs/reference/apm/agents/android">its documentation</a> to learn about its new APIs.</p>
</blockquote>
<p>Elastic® APM for iOS and Android native apps is generally available in the stack release v8.12. The Elastic <a href="https://github.com/elastic/apm-agent-ios">iOS</a> and <a href="https://github.com/elastic/apm-agent-android">Android</a> APM agents are open-source and have been developed on-top, i.e., as a distribution of the OpenTelemetry Swift and Android SDK/API, respectively.</p>
<h2>Overview of the Mobile APM solution</h2>
<p>The OpenTelemetry SDK/API for iOS and Android supports capabilities such as auto-instrumentation of HTTP requests, API for manual instrumentation, data model based on the OpenTelemetry semantic conventions, and buffering support. Additionally, the Elastic APM agent distributions also support an easier initialization process and novel features such as remote config and user session based sampling. The Elastic <a href="https://github.com/elastic/apm-agent-ios">iOS</a> and <a href="https://github.com/elastic/apm-agent-android">Android</a> APM agents being <em>distributions</em> are maintained per Elastic’s standard support T&amp;Cs.</p>
<p>There are curated or pre-built dashboards provided in Kibana® for monitoring, data analysis, and for troubleshooting purposes. The <strong>Service Overview</strong> view shown below provides relevant frontend KPIs such as crash rate, http requests, average app load time, and more, including the comparison view.</p>
<p><img src="https://www.elastic.co/observability-labs/assets/images/apm-ios-android-native-apps/1.png" alt="1 - comparison view" /></p>
<p>Further, the geographic distribution of user traffic is available on a map at a country and regional level. The service overview dashboard also shows trends of metrics such as throughput, latency, failed transaction rate, and distribution of traffic by device make-model, network connection type, and app version.</p>
<p>The <strong>Transactions</strong> view shown below highlights the performance of the different transaction groups, including the distributed trace end-to-end of individual transactions with links to associated spans, errors and crashes. Further, users can see at a glance the distribution of traffic by device make and model, app version, and OS version.</p>
<p><img src="https://www.elastic.co/observability-labs/assets/images/apm-ios-android-native-apps/2.png" alt="2- opbeans android" /></p>
<p>Tabular views such as the one highlighted below located at the bottom of <strong>Transactions</strong> tab makes it relatively easy to see how the device make and model, App version, etc., impacts latency and crash rate.</p>
<p><img src="https://www.elastic.co/observability-labs/assets/images/apm-ios-android-native-apps/3.png" alt="3 - latency and crash rate" /></p>
<p>The <strong>Errors &amp; Crashes</strong> view shown below can be used to analyze the different error and crash groups. The unsymbolicated (iOS) or obfuscated (Android) stacktrace of the individual error or crash instance is also available in this view.</p>
<p><img src="https://www.elastic.co/observability-labs/assets/images/apm-ios-android-native-apps/4.png" alt="4 - opbeans swift" /></p>
<p>The <strong>Service Map</strong> view shown below provides a visualization of the end-to-end service interdependencies, including any third-party APIs, proxy servers, and databases.</p>
<p><img src="https://www.elastic.co/observability-labs/assets/images/apm-ios-android-native-apps/5.png" alt="5 - flowchart" /></p>
<p>The comprehensive pre-built dashboards for observing the mobile frontend in Kibana provide visibility into the sources of errors, crashes, and bottlenecks to ease troubleshooting of issues in the production environment. The underlying Elasticsearch® Platform also supports the ability to query raw data, build custom metrics and custom dashboards, alerting, SLOs, and anomaly detection. Altogether the platform provides a comprehensive set of tools to expedite root cause analysis and remediation, thereby facilitating a high velocity of innovation.</p>
<h2>Walkthrough of the debugging workflow for some error scenarios</h2>
<p>Next, we will provide a walkthrough of the configuration details and the troubleshooting workflow for a couple of error scenarios in iOS and Android native apps.</p>
<h3>Scenario 1</h3>
<p>In this example, we will debug a crash in an asynchronous method using Apple’s crash report <strong>symbolication</strong> as well as <strong>breadcrumbs</strong> to deduce the cause of the crash.</p>
<p><strong>Symbolication</strong><br />
In this scenario, users notice a spike in the crash occurrences of a particular crash group in the Errors &amp; Crashes tab and decide to investigate further. A new crash comes in on the Crashes tab, and the developer follows these steps to symbolicate the crash report locally.</p>
<ol>
<li>Copy the crash via the UI and paste it into a file with the following name format &lt;AppBinaryName&gt;_&lt;DateTime&gt;. For example, “opbeans-swift_2024-01-18-114211.ips`.</li>
</ol>
<p><img src="https://www.elastic.co/observability-labs/assets/images/apm-ios-android-native-apps/6.png" alt="6 - Symbolication" /></p>
<ol start="2">
<li>Apple provides <a href="https://developer.apple.com/documentation/xcode/adding-identifiable-symbol-names-to-a-crash-report">detailed instructions</a> on how to symbolicate this file locally either automatically through Xcode or manually using the command line.</li>
</ol>
<p><strong>Breadcrumbs</strong><br />
The second frame of the first thread shows that the crash is occuring in a Worker instance.</p>
<p><img src="https://www.elastic.co/observability-labs/assets/images/apm-ios-android-native-apps/7.png" alt="7 - Breadcrumbs" /></p>
<p>This instance is actually used in many places, and due to the asynchronous nature of this function, it’s not possible to determine immediately where this call is coming from. Nevertheless, we can utilize features of the Open Telemetry SDK to add more context to these crashes and then put the pieces together to find the site of the crash.</p>
<p>By adding “breadcrumbs” around this Worker instance, it is possible to track down which calls to the Worker are actually associated with this crash.</p>
<p><strong>Example:</strong><br />
Create a logger provider in the Worker class as a public variable for ease of access, as shown below:</p>
<p><img src="https://www.elastic.co/observability-labs/assets/images/apm-ios-android-native-apps/8.png" alt="8 - example code" /></p>
<p>Create breadcrumbs everywhere the Worker.doWork() function is called:</p>
<p><img src="https://www.elastic.co/observability-labs/assets/images/apm-ios-android-native-apps/9.png" alt="9 - Create breadcrumbs everywhere the Worker.doWork() function" /></p>
<p>Each of these breadcrumbs will use the same event <strong>name</strong> “worker_breadcrumb” so they can be consistently queried, and the differentiation will be done using the “ <strong>source</strong> ” attribute.</p>
<p>In this example, the Worker.doWork() function is being called from a CustomerRow struct (a table row which does work ‘onTapGesture’). If you were to call this method from multiple places in a CustomerRow struct, you may also add additional differentiations to the “ <strong>source</strong> ” attribute value, such as the associated function (e.g., “CustomerRow#onTapGesture”).</p>
<p>Now that the app is reporting these breadcrumbs, we can use Discover to <strong>query</strong> for them, as shown below:</p>
<p><img src="https://www.elastic.co/observability-labs/assets/images/apm-ios-android-native-apps/10.png" alt="10 - Discover to query" /></p>
<p>_ <strong>Note:</strong> _ <em>Event</em> _ <strong>names</strong> _ <em>sent by the agent are translated to event</em> _ <strong>action</strong> _ <em>in Elastic Common Schema (ECS), so ensure the query uses this field.</em></p>
<ol>
<li>
<p>You can add a filter: <code>event.action: “worker_breadcrumb”</code> and it shows all events generated from this new breadcrumb.</p>
</li>
<li>
<p>You can also see the various sources: ProductRow, CustomerRow, CartRow, etc.</p>
</li>
<li>
<p>If you add <strong>error.type : crash</strong> to the query, you can see crashes alongside the breadcrumbs:</p>
</li>
</ol>
<p><img src="https://www.elastic.co/observability-labs/assets/images/apm-ios-android-native-apps/11.png" alt="11 - crashes along side the breadcrumbs" /></p>
<p>A crash and a breadcrumb next to each other in the timeline may come from completely different devices, so we need another differentiator. For each crash, we have metadata that contains the <strong>session.id</strong> associated with the crash, viewable from the Metadata tab. We can query using this <strong>session.id</strong> to ensure that the only data we are looking at in Discover is from a single user session (i.e., a single device) that resulted in the crash.</p>
<p><img src="https://www.elastic.co/observability-labs/assets/images/apm-ios-android-native-apps/12.png" alt="12. - session.id" /></p>
<p>In Discover, we can now see the session event flow, on a single device, concerning the crash via the breadcrumbs, as shown below:</p>
<p><img src="https://www.elastic.co/observability-labs/assets/images/apm-ios-android-native-apps/13.png" alt="13 - session event flow" /></p>
<p>It looks like the last breadcrumb before the crash was from the “CustomerRow” breadcrumb. Now this gives the app developer a good place to start their root cause analysis or investigation.</p>
<h3>Scenario 2</h3>
<p>_ <strong>Note:</strong> _ <em>This scenario requires the Elastic Android agent version “0.14.0” or higher.</em></p>
<p>An Android sample app has a form composed of two screens that are created using two fragments (<code>FirstPage</code> and <code>SecondPage</code>). In the first screen, the app makes a backend API call to get a key that identifies the form submission. This key is stored in memory in the app and must be available on the last screen where the form is sent; the key must be sent along with the form's data.</p>
<p><img src="https://www.elastic.co/observability-labs/assets/images/apm-ios-android-native-apps/14.jpg" alt="14 - form submission" /></p>
<p><strong>The problem</strong><br />
We start to see a spike in crash occurrences in Kibana (null pointer exception) in the Errors &amp; Crashes tab that always seem to happen on the last screen of the form, when the users click on the &quot;FINISH&quot; button. Nevertheless, <strong>this is not always reproducible</strong> , so the root cause isn't clear just by looking at the crash’s stacktrace alone. Here’s what it looks like:</p>
<p><img src="https://www.elastic.co/observability-labs/assets/images/apm-ios-android-native-apps/15.png" alt="15 - stack trace" /></p>
<p>When we take a look at the code referenced in the stacktrace, this is what we can see:</p>
<p><img src="https://www.elastic.co/observability-labs/assets/images/apm-ios-android-native-apps/16.png" alt="16 - When we take a look at the code referenced in the stacktrace, this is what we can see:" /></p>
<p>This is the line where the crash happens, so it seems like the variable “formId” (which is a static String located in “FirstPage”) was null by the time this code was executed, causing a null pointer exception to be raised. This variable is set within the “FirstPage” fragment after the backend request is done to retrieve the id. The only way to get to the “SecondPage” is by passing through the “FirstPage.” So, the stacktrace alone doesn’t help much as the pages have to be opened in order, and the first one will always set the “formId” variable. Therefore, it doesn’t seem likely that the formId could be null in “SecondPage.”</p>
<p><strong>Finding the root cause</strong><br />
Apart from taking a look at the crash’s stacktrace, it could also be useful to take a look at complementary data that would help put the pieces together and get a broader picture of what other things happened while our app was running when the crash happened. For this case, we know that the form ID must come from our backend service, so we could start by ruling out that there was an error with the backend call. We do this by checking the traces from the creation of our FirstPage fragment where the form ID request is executed, in the Transaction details view:</p>
<p><img src="https://www.elastic.co/observability-labs/assets/images/apm-ios-android-native-apps/17.png" alt="17 - trace sample" /></p>
<p>The “Created” spans represent the time it took to create the first fragment. The topmost one shows the Activity creation, followed by the NavHostFragment, followed by “FirstScreen.” Not long after its creation, we see that a GET HTTP request to our backend is made to retrieve our form ID and, according to the traces, the GET request was successful. We can therefore rule out that there is an issue with the backend communication for this problem.</p>
<p>Another option could be looking at the logs sent throughout the <a href="https://opentelemetry.io/docs/specs/semconv/general/session/">session</a> in our app where the crash occurred (we could also take a look at all the logs coming from our app but they would be too many to analyze this one issue). To do so, we first copy one of the spans’ “session.id” values (any span would work since the same session ID will be available in all the data that was sent from our app during the time that the crash occurred) available in the span details flyout.</p>
<p><img src="https://www.elastic.co/observability-labs/assets/images/apm-ios-android-native-apps/18.png" alt="18 - red box highlighted" /></p>
<p>_ <strong>Note:</strong> _ <em>The same session ID can also be found in the crash metadata.</em></p>
<p>Now that we have identified our session, we can open up the Logs Explorer view and take a look at all of our app’s logs within that same session, as shown below:</p>
<p><img src="https://www.elastic.co/observability-labs/assets/images/apm-ios-android-native-apps/19.png" alt="19 - app's logs" /></p>
<p>By looking at the logs, and adding a few fields to show the app’s lifecycle status and the error types, we see the log events that are <a href="https://github.com/elastic/apm/blob/main/specs/agents/mobile/events.md">automatically collected</a> from our app. We can see the crash event at the top of the list as the latest one. We can also see our app’s lifecycle events, and if we keep scrolling through, we’ll get to some lifecycle events that are going to help find our root cause:</p>
<p><img src="https://www.elastic.co/observability-labs/assets/images/apm-ios-android-native-apps/20.png" alt="20 - root cause" /></p>
<p>We can see there are a couple of lifecycle events that tell us that the app was restarted during the session. This is an important hint because it means that the Android OS killed our app at some point, which is common when an app stays in the background for a while. With this information, we could try to reproduce the issue by forcing the OS to kill our app in the background and then see how it behaves when reopened from the recently opened apps menu.</p>
<p>After giving it a try, we could reproduce the issue and we found that the static “formId” variable was lost when the app was restarted, causing it to be null when the SecondPage fragment requested it. We can now research best practices of passing arguments to Fragments so we can change our code to prevent relying on static fields and instead store and share values between screens, thus preventing this crash from happening again.</p>
<p><strong>Bonus:</strong> For this scenario, it was enough for us to rely on the events that are sent automatically by the APM Agent; however, if those aren’t enough for other cases, we can always send custom events in the places where we want to track the state changes of our app via the OpenTelemetry event API, as shown in the the code snippet below:</p>
<p><img src="https://www.elastic.co/observability-labs/assets/images/apm-ios-android-native-apps/21.png" alt="21 - black code box" /></p>
<h2>Make the most of your Elastic APM Experience</h2>
<p>In this post, we reviewed Elastic’s new Mobile APM solution available in 8.12. The new solution uses Elastic’s new <a href="https://github.com/elastic/apm-agent-ios">iOS</a> and <a href="https://github.com/elastic/apm-agent-android">Android</a> APM agents that are open-source and have been developed on-top, i.e., as a distribution of the OpenTelemetry Swift and Android SDK/API, respectively.</p>
<p>We also reviewed configuration details and the troubleshooting workflow for two error scenarios in iOS and Android native apps.</p>
<ul>
<li>
<p><strong>iOS scenario:</strong> Debug a crash in an asynchronous method using Apple’s crash report <strong>symbolication</strong> as well as <strong>breadcrumbs</strong> to deduce the cause of the crash.</p>
</li>
<li>
<p><strong>Android scenario:</strong> Analyze why users get a null pointer exception on the last screen when they click on the “FINISH” button of a form. Analyzing this is not always clear by looking at the crash’s stack trace and isn’t easily reproducible.</p>
</li>
</ul>
<p>In both instances, we found the root cause of the crash using distributed traces from the mobile device as well as correlated logs. Hopefully this blog provided a review of how Elastic can help manage and monitor Mobile native apps.</p>
<p>Elastic invites SREs and developers to experience our Mobile APM solution firsthand and unlock new horizons in their data tasks. Try it today at <a href="https://ela.st/free-trial">https://ela.st/free-trial</a>.</p>
<p><em>The release and timing of any features or functionality described in this post remain at Elastic's sole discretion. Any features or functionality not currently available may not be delivered on time or at all.</em></p>
]]></content:encoded>
            <category>observability-labs</category>
            <enclosure url="https://www.elastic.co/observability-labs/assets/images/apm-ios-android-native-apps/141949-elastic-blogheaderimage.png" length="0" type="image/png"/>
        </item>
    </channel>
</rss>