Agent Native

setup-app-insights

Configures Application Insights telemetry for a Power Apps mobile app by managing the appInsightsConfig in app.json.

by MicrosoftOfficial publisherNot reviewed

Identity proven by GitHub's verified organisation badge (microsoft)

Agents
Claude Code
License
MIT (permissive)
Pin
ca144d2pinned Oct 9, 2026
Context cost
about 3,600 tokenswhen the skill loads
GitHub stars
978on microsoft/power-platform-skills
Scripts
None found

What it does

“Configure optional customer-owned Application Insights telemetry for a Power Apps mobile app — enable it against an existing Azure resource, change the resource, or disable it. Standalone, and invoked by /edit-app.”
The author's description, from SKILL.md

Generated summary from the skill's own text

Configures Application Insights telemetry for a Power Apps mobile app by managing the appInsightsConfig in app.json. The skill discovers workspace-based Azure Application Insights resources, validates them, and updates the app configuration while never storing sensitive connection strings in project files.

When to use it

  • Enable, change, or disable Application Insights on an existing app
  • User wants telemetry for app diagnostics and custom events
  • App needs to connect to customer-owned Azure Application Insights resource
  • Invoked by /edit-app when only Application Insights configuration changes

When not to

  • Adding custom events to app screens, configure Application Insights first
  • Provisioning new Azure resources, skill only accepts existing resources
  • Changing data model, connectors, screens, or native capabilities

Install

These commands install from the publisher's repository and need no account.

skills CLI

npx skills add microsoft/power-platform-skills --skill setup-app-insights

Installs from the repository's default branch, which may have changed since the commit we checked.

GitHub CLI 2.90 or later

gh skill install microsoft/power-platform-skills setup-app-insights@ca144d29c1665a329ab4b8e14946b2105e7622fa

Installs the commit we checked (ca144d2).

Copy by hand

Download the folder at ca144d2 and put it in .claude/skills/setup-app-insights for Claude Code and in .agents/skills/setup-app-insights for Codex, Cursor, Gemini CLI, GitHub Copilot and OpenCode.

Skill folder on GitHub at ca144d2

Claude Code plugin

/plugin install azure-cosmos-db-assistant@claude-plugins-official

The publisher's plugin in Claude's official marketplace. It may hold more than this skill, and we have not pinned it.

Claude Code plugin

/plugin install azure@claude-plugins-official

The publisher's plugin in Claude's official marketplace. It may hold more than this skill, and we have not pinned it.

Claude Code plugin

/plugin install azure-sql-developer@claude-plugins-official

The publisher's plugin in Claude's official marketplace. It may hold more than this skill, and we have not pinned it.

Copy for your agent

A prompt for any coding agent. It installs this skill from GitHub at the pinned commit, copies the files as they are, and runs nothing unless you ask.

Prompt

Install the agent skill "setup-app-insights" by Microsoft.

Source, pinned to commit ca144d29c1665a329ab4b8e14946b2105e7622fa:
https://github.com/microsoft/power-platform-skills/tree/ca144d29c1665a329ab4b8e14946b2105e7622fa/plugins/mobile-apps/skills/setup-app-insights

1. Download that folder at exactly this commit. Do not use the default branch.
2. Copy every file unchanged, keeping the folder structure, into .claude/skills/setup-app-insights/ for Claude Code and .agents/skills/setup-app-insights/ for Codex, Cursor, Gemini CLI, GitHub Copilot and OpenCode. Create the folders if they do not exist.
3. Do not edit the files, and do not run any script in the folder unless I ask you to.
4. When you are done, list the files you copied and where you put them.

Listing and checks: https://www.agentnative.dev/skills/microsoft/setup-app-insights

SKILL.md at the pin

---
name: setup-app-insights
description: Configure optional customer-owned Application Insights telemetry for a Power Apps mobile app — enable it against an existing Azure resource, change the resource, or disable it. Standalone, and invoked by /edit-app.
user-invocable: true
allowed-tools: Read, Write, Edit, Glob, Grep, Bash, AskUserQuestion, Skill
model: opus
---

> **Plugin check**: Run `node "${PLUGIN_ROOT}/scripts/check-version.js"` - if it outputs a message, show it to the user before proceeding.

**Shared instructions: [shared-instructions.md](../../shared/shared-instructions.md)** — read first.

# Set up Application Insights

Configures the generated app's optional, customer-owned Application Insights telemetry through `app.json` → `expo.extra.appInsightsConfig`. This is host/runtime configuration, not a connector or plan section — it never touches the data model, native-capability matrix, connector list, or screens.

Application Insights is **off by default**. Invoking this skill (or approving its mutation) is the explicit opt-in; consent is never inferred from an app description.

## When to use

- `/setup-app-insights` — enable, change, or disable Application Insights on an existing app.
- Invoked by `/edit-app` when the request is only an Application Insights change (its Step 0.5 fast path delegates here).
- Examples: "Enable Application Insights for this app", "Change the Application Insights resource this app uses", "Disable Application Insights for this app".

## When NOT to use

- Adding or changing custom events in app screens → configure Application Insights here first, then continue through `/edit-app` for those source changes.
- Data model / connector / native / design / screen changes → the respective `/add-*`, `/setup-*`, `/edit-app`, or `/design-system` skills.
- Provisioning a new Azure Application Insights resource → out of scope; this skill discovers or accepts an **existing** resource.

## Inputs

- `working_dir` — absolute path to the project root (auto-detected from cwd, or passed by an orchestrator).
- `--action <enable|change-resource|disable>` — optional; when omitted, inferred from current state and one question.

## Step 1 — Detect invocation mode

**Telemetry checkpoint: `resolve_app_insights_mode`**

```
1. Check env var CODE_APPS_NATIVE_ORCHESTRATING=1
   → Mode A (invoked by /edit-app). Use the passed --working-dir. Return a status block.

2. Else resolve working_dir from cwd (must contain app.json with an expo object)
   → Mode B (standalone). Return a human summary.
```

## Step 2 — Inspect and determine the action

**Telemetry checkpoint: `determine_app_insights_action`**

Read, when present:

- `<working_dir>/app.json`
- `<working_dir>/app/_layout.tsx`
- `<working_dir>/package.json`
- `<working_dir>/memory-bank.md`

If `app.json` is missing, malformed, or has no `expo` object, STOP without mutation (`BLOCKED` in Mode A). If uncommitted work overlaps `app.json` or `app/_layout.tsx`, follow the changed-file overlap approval rule in `shared-instructions.md`.

Determine the action:

- `enable` — `appInsightsConfig.enabled` is absent or `false` and the user wants it on.
- `change-resource` — already `enabled: true` and the user wants a different destination.
- `disable` — the user wants Application Insights turned off.
- If intent is ambiguous, ask one `AskUserQuestion` with those three choices, seeded by the current `enabled` state.

## Step 3 — Mutation preview + approval

**Telemetry checkpoint: `review_app_insights_change`**

Show one focused preview and continue only after approval:

```text
─── Application Insights ────────────────────────────
Action        <enable | change resource | disable>
Current       enabled: <true|false>
Configuration app.json → expo.extra.appInsightsConfig
Provider      app/_layout.tsx → PowerAppsProvider appConfig
Sensitive     connection string is never printed or stored in memory-bank.md
```

Ask: `Apply this Application Insights change?`

## Step 4 — Emit the selection telemetry

After the action is confirmed, record the choice through Mobile Apps usage telemetry (`enabled` for enable/change-resource, `disabled` for disable):

```bash
node "${PLUGIN_ROOT}/hooks/run-telemetry.js" \
  app-insights-selection \
  "<enabled-or-disabled>" \
  "<prompt-or-pretool>" \
  '<working_dir>'
```

Pass the invocation source so the event's `invocationSource` matches how the skill was reached: `pretool` in Mode A (delegated from another skill such as `/edit-app` via the Skill tool) and `prompt` in Mode B (the user ran `/setup-app-insights` directly).

This event follows the existing Mobile Apps telemetry controls and contains no Application Insights resource details or connection string. It fails open and never blocks the skill.

## Step 5a — enable / change-resource

**Telemetry checkpoint: `configure_app_insights_resource`**

Discover Application Insights resources visible to the current Azure CLI identity:

```bash
az resource list \
  --resource-type Microsoft.Insights/components \
  --query "[].{name:name,id:id,resourceGroup:resourceGroup,location:location}" \
  -o json
```

Branch on the result:

- **One or more resources returned:** use `AskUserQuestion` to let the user select one. Before configuring it, confirm the selected component is **workspace-based** — `az resource list` returns every `Microsoft.Insights/components`, including classic components, which are not compliant with this skill's contract. Read `properties.WorkspaceResourceId` from the selected resource:

  ```bash
  WORKSPACE_RESOURCE_ID=$(
    az resource show \
      --ids "<selected-resource-id>" \
      --api-version 2020-02-02 \
      --query properties.WorkspaceResourceId \
      -o tsv
  )
  ```

  If `WORKSPACE_RESOURCE_ID` is empty, the resource is a classic (non-workspace-based) component: do **not** configure it. Explain that only a workspace-based Application Insights resource is supported, and let the user select a different resource or use the admin handoff below. Otherwise retrieve its connection string without printing it:

  ```bash
  APP_INSIGHTS_CONNECTION_STRING=$(
    az resource show \
      --ids "<selected-resource-id>" \
      --api-version 2020-02-02 \
      --query properties.ConnectionString \
      -o tsv
  )
  ```

- **Not logged in:** tell the user to run `az login`, then retry discovery once.
- **No subscription/resource access or authorization failure:** explain that Application Insights Azure RBAC is separate from Power Platform and Entra app-registration permissions. Offer an admin handoff: an administrator can create/select one workspace-based Application Insights resource and give the user its connection string.
- **No resources returned:** ask whether the user wants to paste an administrator-provided connection string or leave telemetry disabled. Do not require the user to create Azure resources.

When accepting a pasted connection string, use `AskUserQuestion` freeform and never repeat the answer in chat or command output. Validate only that it contains `InstrumentationKey=` and either an `IngestionEndpoint=` or that the standard public-cloud default can be used. Do not store the connection string in `memory-bank.md`.

Update `<working_dir>/app.json` so `expo.extra.appInsightsConfig` contains:

```json
{
  "expo": {
    "extra": {
      "appInsightsConfig": {
        "enabled": true,
        "connectionString": "<selected-or-pasted-connection-string>",
        "appId": "<appId>",
        "environment": "development",
        "includeUserId": false
      }
    }
  }
}
```

Field rules:

- `appId` — preserve the existing non-empty value; otherwise use `expo.slug`, then `package.json` `name`.
- `environment` / `includeUserId` — preserve existing values; default to `"development"` and `false`. Never turn on user identity collection implicitly.
- Set `enabled: true` and replace only the connection string. Create the `appInsightsConfig` object when missing, and preserve every other `app.json` field.

Never print the connection string, pass it to another agent, write it to `native-app-plan.md` or `memory-bank.md`, or include it in a summary.

### Runtime notes (for screen work that follows)

The app uses `@microsoft/applicationinsights-web` with the React Native manual-device plugin. The first runtime event is `PowerAppsNative.ApplicationStarted`, a deterministic ingestion check after loading the app in Dev Player. The runtime exposes two intentionally different loggers:

```ts
import {
  getAppLogger,
  getCustomEventsLogger,
} from '@microsoft/power-apps-native-host';
```

- `getAppLogger()` is the host/runtime logger; its events continue to Microsoft OneDS and also fan out to the configured Application Insights resource.
- `getCustomEventsLogger()` is for the app's custom events; it goes only to the configured Application Insights resource and is a no-op when custom events are disabled.
- Generate custom event calls only when the user explicitly requested those events or an approved screen spec has a `Custom events` entry. Never use `getAppLogger()` for custom events.
- Telemetry properties must be approved scalar values (result codes, durations, counts, screen identifiers, operation names). Never include form values, free text, record titles, names, emails, phone numbers, tokens, precise coordinates, nested objects, or complete URLs.

Persist in `memory-bank.md` (never the connection string):

```markdown
- Custom events: enabled
- Custom events app ID: <appId>
- Custom events resource ID: <selected-resource-id or admin-provided>
- Custom events destination: one customer-owned workspace-based Application Insights resource
```

## Step 5b — disable

**Telemetry checkpoint: `disable_app_insights`**

Set `enabled: false`, clear `connectionString`, and preserve `appId` and `environment` when present. Keep `includeUserId: false` unless an existing explicitly approved value must be preserved. Do not require Azure sign-in or resource discovery.

```json
{
  "expo": {
    "extra": {
      "appInsightsConfig": {
        "enabled": false,
        "connectionString": "",
        "appId": "<appId>",
        "environment": "development",
        "includeUserId": false
      }
    }
  }
}
```

Persist `Custom events: disabled` and the app ID in `memory-bank.md`; remove stale resource ID / destination lines.

## Step 6 — Verify the provider wiring

**Telemetry checkpoint: `verify_app_insights_provider`**

Confirm `app/_layout.tsx` imports the root `app.json` and passes the complete object to `PowerAppsProvider`:

```tsx
import appConfig from '../app.json';

<PowerAppsProvider appConfig={appConfig}>
```

If either part is missing, patch only the import and the `appConfig` prop; preserve all other provider props and layout behavior. Run `npx --no-install tsc --noEmit` only when `app/_layout.tsx` changed.

Parse `app.json` with Node after the mutation and assert:

- `enable` / `change-resource`: `enabled === true` and `connectionString` is non-empty.
- `disable`: `enabled === false` and `connectionString === ""`.

## Step 6.5 — Offer operation instrumentation (enable / change-resource only)

**Telemetry checkpoint: `offer_operation_instrumentation`**

This skill only wires the telemetry pipeline; it never edits screens or generated services. Enabling Application Insights emits host-level signals (app load, unhandled errors, navigation) automatically, but **domain events like `todo_created` or `order_deleted` are custom events and require source changes**. Those changes belong to `/edit-app` → screen-planner → screen-builder, which emit named events through `getCustomEventsLogger` under the existing scalar-only, no-PII allowlist. Offer that follow-up here; never instrument operations from this skill.

Run this step only after a successful `enable` or `change-resource`. Skip it entirely for `disable`.

- **Mode B (standalone):** ask one `AskUserQuestion`, defaulting to **No** (instrumentation is opt-in, mirroring Application Insights being off by default):

  > Application Insights is on. Want me to add custom events for your app's major operations (create / update / delete)?

  - **Yes** → invoke `/edit-app` with a scoped instrumentation brief and let its normal edit flow discover the entities, screens, and operation boundaries (this skill does not read the data model or screens):

    ```
    Invoke skill: /edit-app

    Arguments:
      Add custom events at each successful create, update, and
      delete boundary for the app's main entities. Emit named events through
      getCustomEventsLogger with approved scalar properties only — no
      operation results, response payloads, form values, free text, record
      titles, personal identifiers, tokens, precise coordinates, nested
      objects, or complete URLs. Use trackScenario() for any duration.
    ```

  - **No** → finish with the normal Mode B summary.

- **Mode A (invoked by `/edit-app`):** do **not** ask the user or re-invoke `/edit-app` from here — that would loop back into the orchestrator. Instead signal the available follow-up in the return block (`instrumentation_offer: available`) so `/edit-app` surfaces the offer after the fast path completes.

## Support boundary

This skill discovers or accepts an **existing** Application Insights resource; it does not provision Azure resources. If the user lacks Azure access and has no administrator-provided connection string, leave telemetry disabled without blocking — the app runs fine with custom events off.

## Return

**Mode A (invoked by `/edit-app`) — status block, first line is the status code:**

```
DONE
action: <enable|change-resource|disable>
enabled: <true|false>
app_id: <appId>
layout_patched: <yes|no>
instrumentation_offer: <available|none>
```

`instrumentation_offer` is `available` only after a successful `enable`/`change-resource` (see Step 6.5); use `none` for `disable` or when telemetry was not turned on. Use `DONE_WITH_CONCERNS: <list>` when applied with caveats (e.g. an admin-provided string that could not be verified), `NEEDS_CONTEXT: <missing>` when a required input is unavailable, and `BLOCKED: <reason>` when `app.json` is unusable.

**Mode B (standalone) — human summary:**

> Application Insights <enabled|updated|disabled> for this app.
> Configuration: `app.json` → `expo.extra.appInsightsConfig`
> To change the resource or turn it off later, run `/setup-app-insights` again.

After an `enable`/`change-resource`, if the user accepted the Step 6.5 offer, note that operation instrumentation was handed to `/edit-app`; if they declined, mention they can run `/edit-app` later to add custom operation events.

From microsoft/power-platform-skills at ca144d2, shown as plain text under its license: MIT (permissive). The license text is in LICENSE.

View SKILL.md on GitHub at ca144d2

Files

1 file, 15 KB in total. Each file has a sha256 in the pin's manifest; the first 12 characters are shown.

Skill folder on GitHub at ca144d2
All 50 skills from Microsoft

More from Microsoft

  • pull-requests

    This skill guides the agent in writing high-quality pull request descriptions following the Agent Framework repository template and in systematically handling…

    Claude Code, Codex, Cursor +4 · about 1.5K tokens · pinned 6 days ago

  • appinsights-instrumentation

    This skill provides guidance and reference materials for instrumenting webapps with Azure Application Insights across ASP.NET Core, Node.js, Python, and…

    Contains scripts

    Claude Code, Codex, Cursor +3 · about 840 tokens · pinned 6 days ago

  • azure-ai

    This skill enables agents to use Azure AI services including Search for full-text and vector queries, Speech for transcription and synthesis, OpenAI for…

    Claude Code, Codex, Cursor +4 · about 750 tokens · pinned 6 days ago

  • azure-diagnostics

    The skill diagnoses Azure production issues across App Service, Functions, Container Apps, AKS, VMs, and Messaging services using AppLens, Azure Monitor…

    Contains scripts

    Claude Code, Codex, Cursor +3 · about 1.6K tokens · pinned 6 days ago

  • add-camera

    This skill generates typed TypeScript wrappers for camera capture and image gallery selection in Power Apps mobile apps using Expo libraries.

    Claude Code · about 5.2K tokens · pinned 6 days ago

  • add-connector

    This skill adds Power Platform connectors to Expo/React Native mobile apps by discovering the connector, establishing a connection, generating service files…

    Claude Code · about 3.8K tokens · pinned 6 days ago

All Observability skills
  • operate-on-aws

    This skill operates AWS workloads for early-stage startups by investigating incidents, analyzing root causes, and reviewing code before deployment using AWS…

    by Amazon (AWS)Official publisher

    Claude Code, Codex, Cursor +4 · about 6.8K tokens · pinned 6 days ago

  • sentry-dotnet-sdk

    Installs and configures Sentry error monitoring, tracing, profiling, logging, and cron monitoring across .NET applications including ASP.NET Core, WPF…

    by SentryOfficial publisher

    Claude Code · about 5.7K tokens · pinned 6 days ago

  • dd-azure-integration

    This skill sets up Datadog monitoring for Azure resources using Terraform.

    by DatadogOfficial publisher

    Claude Code, Codex, Cursor +4 · about 6.9K tokens · pinned 6 days ago

  • enable-dsm

    Enables Data Streams Monitoring (DSM) on services already running APM, to measure end-to-end latency, throughput, and consumer lag across message queues and…

    by DatadogOfficial publisher

    Claude Code, Codex, Cursor +4 · about 5.5K tokens · pinned 6 days ago

  • debugging-executions

    Debug workflow execution failures by inspecting failed nodes, re-running executions, and comparing expected versus actual values.

    by n8nOfficial publisher

    Claude Code, Codex, Cursor +3 · about 2.5K tokens · pinned 6 days ago

  • instance-awareness

    This skill teaches the agent to resolve ambiguous requests by reading the instance's activity log and workflow history instead of asking the user to clarify.

    by n8nOfficial publisher

    Claude Code, Codex, Cursor +3 · about 1.3K tokens · pinned 6 days ago

The skills listed here are third-party software, collected from public GitHub repositories as a catalog of recent skills and provided as is. Agent Native does not write or control them and is not responsible for any harm, loss or damage caused by installing or using them. Labels and checks describe what we saw at one commit and are not a guarantee. Read a skill's files before you run it. Terms of use