Skip to content

[Claude][Azure Functions] Add dev/test workflow skill and scripts#8173

Merged
lucaspimentel merged 36 commits intomasterfrom
lpimentel/ai-skills/azure-functions
Feb 25, 2026
Merged

[Claude][Azure Functions] Add dev/test workflow skill and scripts#8173
lucaspimentel merged 36 commits intomasterfrom
lpimentel/ai-skills/azure-functions

Conversation

@lucaspimentel
Copy link
Member

@lucaspimentel lucaspimentel commented Feb 6, 2026

Summary of changes

Adds a Claude Code skill (/azure-functions) and standalone PowerShell scripts to automate the Azure Functions development workflow: build a local Datadog.AzureFunctions NuGet package, deploy to a test Azure Function App, trigger the function, and analyze traces/logs to verify instrumentation behavior.

Skill (.claude/skills/azure-functions/):

  • SKILL.md — Interactive workflow with build-nuget, configure, deploy, test, trace, and analyze commands
  • README.md — User-facing documentation
  • Find-NuGetConfig.ps1 — Locates nuget.config by searching up directory hierarchy
  • Test-EnvVars.ps1 — Verifies required/recommended Datadog env vars on a Function App (checks app state, detects platform, never exposes DD_API_KEY)
  • environment-variables.md — Complete reference for Azure Functions environment variable configuration
  • log-analysis-guide.md — Log analysis patterns (grep commands, timestamp filtering, span tree construction)
  • scripts-reference.md — Script documentation and reusable one-liners

Scripts (tracer/tools/):

  • Build-AzureFunctionsNuget.ps1 — Builds NuGet package with auto-incrementing timestamp-based prerelease versions; validates bundle files; supports -BuildId (download release artifacts) and -CopyTo (local feed)
  • Deploy-AzureFunction.ps1 — Automates dotnet restore, func azure functionapp publish, wait, trigger, and timestamp capture
  • Get-AzureFunctionLogs.ps1 — Downloads logs via az webapp log download, extracts, analyzes tracer version, counts spans (filters noisy host spans), validates parenting

Build change (Build.cs):

  • Passes --Version through to BuildAzureFunctionsNuget Nuke target

Reason for change

Working with Azure Functions instrumentation requires coordinating multiple manual steps across different tools (build scripts, Azure CLI, func CLI, log extraction, grep for spans/errors). The versioning workflow was error-prone — rebuilding with the same version required manually clearing NuGet caches.

This consolidates the workflow into reusable scripts and a guided skill, switches to auto-incrementing versions (each build is unique), and adds comprehensive validation/troubleshooting.

Implementation details

  • Versioning: Build-AzureFunctionsNuget.ps1 generates SemVer-compliant versions like 3.38.0-dev20260209143022 from base version + UTC timestamp. Sample apps use floating versions (3.38.0-dev*) to auto-resolve latest local builds.
  • Env var verification: Test-EnvVars.ps1 checks app state, detects platform (Linux/Windows), validates required vars (profiling, API key, tracer home, startup hooks, profiler paths) and recommended vars (feature disables). DD_API_KEY is checked for existence only — never retrieved or displayed.
  • Pipeline composition: Deploy-AzureFunction.ps1 outputs a PSCustomObject that pipes directly into Get-AzureFunctionLogs.ps1 for seamless deploy → trigger → analyze workflows.
  • Log analysis: Filters noisy host spans (Microsoft.Azure.WebJobs.Script.WebHost/Host), fixes strict mode .Count errors, improves tracer version extraction.
  • DD_API_KEY security: All skill docs, scripts, and configure workflow only check for DD_API_KEY existence via --query "[?name=='DD_API_KEY'].name" — never fetching or displaying the actual value.

Test coverage

Development tooling (not production code). Manually verified:

  • NuGet build with auto-versioning (SemVer format compatibility with .NET SDK 10)
  • BuildId parameter downloads bundle files from CI releases
  • CopyTo parameter copies to local NuGet feed
  • Bundle file validation catches missing files before build
  • Deploy + trigger + log download pipeline with -OutputPath $env:TEMP
  • Log analysis (version detection, span counting with host filter, parenting checks)
  • Find-NuGetConfig.ps1 directory hierarchy search
  • Test-EnvVars.ps1 against running Linux Function App (all required vars pass, recommended warns on missing)
  • PowerShell version validation

Other details

Internal development tooling engineering teams. Not included in any customer-facing artifacts.

"I used to mass-produce Azure Functions workflows by hand. Now I automate them with a skill that automates me automating them. I think I just put myself in a recursion." — Claude 🤖

@lucaspimentel lucaspimentel added the AI Generated Largely based on code generated by an AI or LLM. This label is the same across all dd-trace-* repos label Feb 6, 2026
@github-actions github-actions bot added area:docs and removed AI Generated Largely based on code generated by an AI or LLM. This label is the same across all dd-trace-* repos labels Feb 6, 2026
@lucaspimentel lucaspimentel changed the title Add Claude skill for Azure Functions workflow automation Add Azure Functions skill for workflow automation Feb 6, 2026
@lucaspimentel lucaspimentel force-pushed the lpimentel/ai-skills/azure-functions branch 2 times, most recently from cb474c2 to c7dc6f5 Compare February 9, 2026 20:56
@dd-trace-dotnet-ci-bot
Copy link

dd-trace-dotnet-ci-bot bot commented Feb 9, 2026

Execution-Time Benchmarks Report ⏱️

Execution-time results for samples comparing This PR (8173) and master.

✅ No regressions detected - check the details below

Full Metrics Comparison

FakeDbCommand

Metric Master (Mean ± 95% CI) Current (Mean ± 95% CI) Change Status
.NET Framework 4.8 - Baseline
duration76.52 ± (76.43 - 76.72) ms76.68 ± (76.67 - 76.99) ms+0.2%✅⬆️
.NET Framework 4.8 - Bailout
duration80.98 ± (80.92 - 81.31) ms81.30 ± (81.08 - 81.44) ms+0.4%✅⬆️
.NET Framework 4.8 - CallTarget+Inlining+NGEN
duration1096.47 ± (1097.40 - 1104.18) ms1095.99 ± (1096.87 - 1103.27) ms-0.0%
.NET Core 3.1 - Baseline
process.internal_duration_ms23.33 ± (23.27 - 23.39) ms23.31 ± (23.25 - 23.36) ms-0.1%
process.time_to_main_ms88.71 ± (88.50 - 88.92) ms88.60 ± (88.39 - 88.81) ms-0.1%
runtime.dotnet.exceptions.count0 ± (0 - 0)0 ± (0 - 0)+0.0%
runtime.dotnet.mem.committed10.91 ± (10.90 - 10.91) MB10.92 ± (10.92 - 10.92) MB+0.1%✅⬆️
runtime.dotnet.threads.count12 ± (12 - 12)12 ± (12 - 12)+0.0%
.NET Core 3.1 - Bailout
process.internal_duration_ms23.23 ± (23.18 - 23.28) ms23.29 ± (23.23 - 23.35) ms+0.3%✅⬆️
process.time_to_main_ms89.95 ± (89.73 - 90.16) ms90.87 ± (90.65 - 91.10) ms+1.0%✅⬆️
runtime.dotnet.exceptions.count0 ± (0 - 0)0 ± (0 - 0)+0.0%
runtime.dotnet.mem.committed10.94 ± (10.94 - 10.94) MB10.95 ± (10.95 - 10.95) MB+0.1%✅⬆️
runtime.dotnet.threads.count13 ± (13 - 13)13 ± (13 - 13)+0.0%
.NET Core 3.1 - CallTarget+Inlining+NGEN
process.internal_duration_ms243.13 ± (239.10 - 247.16) ms240.28 ± (236.25 - 244.32) ms-1.2%
process.time_to_main_ms503.67 ± (502.79 - 504.55) ms505.43 ± (504.49 - 506.37) ms+0.3%✅⬆️
runtime.dotnet.exceptions.count0 ± (0 - 0)0 ± (0 - 0)+0.0%
runtime.dotnet.mem.committed47.58 ± (47.56 - 47.60) MB47.58 ± (47.56 - 47.61) MB+0.0%✅⬆️
runtime.dotnet.threads.count28 ± (28 - 28)28 ± (28 - 28)+0.2%✅⬆️
.NET 6 - Baseline
process.internal_duration_ms22.13 ± (22.09 - 22.18) ms22.24 ± (22.19 - 22.30) ms+0.5%✅⬆️
process.time_to_main_ms77.87 ± (77.66 - 78.08) ms78.70 ± (78.48 - 78.92) ms+1.1%✅⬆️
runtime.dotnet.exceptions.count0 ± (0 - 0)0 ± (0 - 0)+0.0%
runtime.dotnet.mem.committed10.61 ± (10.61 - 10.61) MB10.63 ± (10.63 - 10.63) MB+0.2%✅⬆️
runtime.dotnet.threads.count10 ± (10 - 10)10 ± (10 - 10)+0.0%
.NET 6 - Bailout
process.internal_duration_ms22.03 ± (21.98 - 22.07) ms22.01 ± (21.96 - 22.06) ms-0.1%
process.time_to_main_ms79.07 ± (78.88 - 79.27) ms79.41 ± (79.19 - 79.62) ms+0.4%✅⬆️
runtime.dotnet.exceptions.count0 ± (0 - 0)0 ± (0 - 0)+0.0%
runtime.dotnet.mem.committed10.70 ± (10.69 - 10.71) MB10.75 ± (10.74 - 10.75) MB+0.4%✅⬆️
runtime.dotnet.threads.count11 ± (11 - 11)11 ± (11 - 11)+0.0%
.NET 6 - CallTarget+Inlining+NGEN
process.internal_duration_ms250.25 ± (246.09 - 254.41) ms255.45 ± (251.51 - 259.39) ms+2.1%✅⬆️
process.time_to_main_ms486.69 ± (485.96 - 487.41) ms487.27 ± (486.56 - 487.97) ms+0.1%✅⬆️
runtime.dotnet.exceptions.count0 ± (0 - 0)0 ± (0 - 0)+0.0%
runtime.dotnet.mem.committed48.33 ± (48.31 - 48.35) MB48.35 ± (48.33 - 48.37) MB+0.1%✅⬆️
runtime.dotnet.threads.count28 ± (28 - 28)28 ± (28 - 28)-0.2%
.NET 8 - Baseline
process.internal_duration_ms20.16 ± (20.11 - 20.21) ms20.37 ± (20.32 - 20.42) ms+1.0%✅⬆️
process.time_to_main_ms76.60 ± (76.45 - 76.75) ms77.13 ± (76.97 - 77.29) ms+0.7%✅⬆️
runtime.dotnet.exceptions.count0 ± (0 - 0)0 ± (0 - 0)+0.0%
runtime.dotnet.mem.committed7.65 ± (7.65 - 7.66) MB7.66 ± (7.65 - 7.66) MB+0.0%✅⬆️
runtime.dotnet.threads.count10 ± (10 - 10)10 ± (10 - 10)+0.0%
.NET 8 - Bailout
process.internal_duration_ms20.47 ± (20.42 - 20.52) ms20.12 ± (20.07 - 20.17) ms-1.7%
process.time_to_main_ms78.91 ± (78.74 - 79.07) ms77.67 ± (77.50 - 77.84) ms-1.6%
runtime.dotnet.exceptions.count0 ± (0 - 0)0 ± (0 - 0)+0.0%
runtime.dotnet.mem.committed7.71 ± (7.70 - 7.71) MB7.71 ± (7.71 - 7.72) MB+0.1%✅⬆️
runtime.dotnet.threads.count11 ± (11 - 11)11 ± (11 - 11)+0.0%
.NET 8 - CallTarget+Inlining+NGEN
process.internal_duration_ms193.65 ± (192.92 - 194.39) ms193.26 ± (192.48 - 194.04) ms-0.2%
process.time_to_main_ms464.49 ± (463.82 - 465.17) ms465.40 ± (464.73 - 466.07) ms+0.2%✅⬆️
runtime.dotnet.exceptions.count0 ± (0 - 0)0 ± (0 - 0)+0.0%
runtime.dotnet.mem.committed36.16 ± (36.12 - 36.20) MB36.16 ± (36.12 - 36.21) MB+0.0%✅⬆️
runtime.dotnet.threads.count27 ± (27 - 27)27 ± (27 - 27)+0.0%✅⬆️

HttpMessageHandler

Metric Master (Mean ± 95% CI) Current (Mean ± 95% CI) Change Status
.NET Framework 4.8 - Baseline
duration198.13 ± (198.16 - 199.33) ms201.24 ± (200.52 - 201.66) ms+1.6%✅⬆️
.NET Framework 4.8 - Bailout
duration202.13 ± (201.97 - 202.86) ms207.21 ± (206.45 - 207.68) ms+2.5%✅⬆️
.NET Framework 4.8 - CallTarget+Inlining+NGEN
duration1164.63 ± (1164.87 - 1173.24) ms1179.34 ± (1178.55 - 1188.03) ms+1.3%✅⬆️
.NET Core 3.1 - Baseline
process.internal_duration_ms206.15 ± (205.38 - 206.92) ms196.80 ± (196.33 - 197.26) ms-4.5%
process.time_to_main_ms88.90 ± (88.58 - 89.23) ms85.51 ± (85.25 - 85.77) ms-3.8%
runtime.dotnet.exceptions.count3 ± (3 - 3)3 ± (3 - 3)+0.0%
runtime.dotnet.mem.committed15.97 ± (15.95 - 15.99) MB16.03 ± (16.01 - 16.04) MB+0.4%✅⬆️
runtime.dotnet.threads.count20 ± (20 - 20)20 ± (20 - 20)-1.4%
.NET Core 3.1 - Bailout
process.internal_duration_ms199.01 ± (198.28 - 199.74) ms195.28 ± (194.80 - 195.76) ms-1.9%
process.time_to_main_ms87.81 ± (87.49 - 88.13) ms85.87 ± (85.66 - 86.08) ms-2.2%
runtime.dotnet.exceptions.count3 ± (3 - 3)3 ± (3 - 3)+0.0%
runtime.dotnet.mem.committed15.99 ± (15.97 - 16.01) MB16.11 ± (16.09 - 16.13) MB+0.7%✅⬆️
runtime.dotnet.threads.count21 ± (21 - 21)21 ± (20 - 21)-1.2%
.NET Core 3.1 - CallTarget+Inlining+NGEN
process.internal_duration_ms437.95 ± (434.69 - 441.22) ms434.72 ± (431.35 - 438.09) ms-0.7%
process.time_to_main_ms502.62 ± (501.14 - 504.11) ms490.82 ± (489.52 - 492.12) ms-2.3%
runtime.dotnet.exceptions.count3 ± (3 - 3)3 ± (3 - 3)+0.0%
runtime.dotnet.mem.committed58.07 ± (57.95 - 58.19) MB58.11 ± (58.00 - 58.22) MB+0.1%✅⬆️
runtime.dotnet.threads.count29 ± (29 - 30)29 ± (29 - 29)-0.1%
.NET 6 - Baseline
process.internal_duration_ms205.27 ± (204.63 - 205.90) ms199.66 ± (199.06 - 200.27) ms-2.7%
process.time_to_main_ms75.41 ± (75.10 - 75.73) ms73.67 ± (73.42 - 73.92) ms-2.3%
runtime.dotnet.exceptions.count4 ± (4 - 4)4 ± (4 - 4)+0.0%
runtime.dotnet.mem.committed16.25 ± (16.23 - 16.27) MB16.31 ± (16.29 - 16.32) MB+0.3%✅⬆️
runtime.dotnet.threads.count19 ± (19 - 19)19 ± (19 - 19)-0.9%
.NET 6 - Bailout
process.internal_duration_ms204.67 ± (204.18 - 205.17) ms203.84 ± (203.13 - 204.56) ms-0.4%
process.time_to_main_ms76.67 ± (76.41 - 76.94) ms75.87 ± (75.56 - 76.19) ms-1.0%
runtime.dotnet.exceptions.count4 ± (4 - 4)4 ± (4 - 4)+0.0%
runtime.dotnet.mem.committed16.28 ± (16.27 - 16.30) MB16.31 ± (16.29 - 16.33) MB+0.2%✅⬆️
runtime.dotnet.threads.count20 ± (20 - 20)20 ± (20 - 20)-1.1%
.NET 6 - CallTarget+Inlining+NGEN
process.internal_duration_ms461.96 ± (459.08 - 464.84) ms461.98 ± (460.23 - 463.74) ms+0.0%✅⬆️
process.time_to_main_ms470.84 ± (469.57 - 472.11) ms468.31 ± (467.19 - 469.42) ms-0.5%
runtime.dotnet.exceptions.count4 ± (4 - 4)4 ± (4 - 4)+0.0%
runtime.dotnet.mem.committed57.54 ± (57.42 - 57.67) MB57.56 ± (57.46 - 57.66) MB+0.0%✅⬆️
runtime.dotnet.threads.count29 ± (29 - 30)29 ± (29 - 30)-0.1%
.NET 8 - Baseline
process.internal_duration_ms205.09 ± (204.36 - 205.82) ms196.20 ± (195.74 - 196.66) ms-4.3%
process.time_to_main_ms74.47 ± (74.20 - 74.74) ms71.68 ± (71.51 - 71.85) ms-3.8%
runtime.dotnet.exceptions.count4 ± (4 - 4)4 ± (4 - 4)+0.0%
runtime.dotnet.mem.committed11.62 ± (11.61 - 11.64) MB11.70 ± (11.68 - 11.71) MB+0.7%✅⬆️
runtime.dotnet.threads.count19 ± (19 - 19)18 ± (18 - 18)-1.8%
.NET 8 - Bailout
process.internal_duration_ms199.60 ± (198.94 - 200.26) ms195.43 ± (194.92 - 195.95) ms-2.1%
process.time_to_main_ms74.43 ± (74.18 - 74.69) ms72.94 ± (72.75 - 73.14) ms-2.0%
runtime.dotnet.exceptions.count4 ± (4 - 4)4 ± (4 - 4)+0.0%
runtime.dotnet.mem.committed11.71 ± (11.70 - 11.73) MB11.72 ± (11.70 - 11.73) MB+0.0%✅⬆️
runtime.dotnet.threads.count20 ± (19 - 20)19 ± (19 - 19)-1.2%
.NET 8 - CallTarget+Inlining+NGEN
process.internal_duration_ms378.98 ± (377.38 - 380.58) ms376.60 ± (374.99 - 378.22) ms-0.6%
process.time_to_main_ms451.60 ± (450.34 - 452.86) ms451.78 ± (450.57 - 452.99) ms+0.0%✅⬆️
runtime.dotnet.exceptions.count4 ± (4 - 4)4 ± (4 - 4)+0.0%
runtime.dotnet.mem.committed47.72 ± (47.69 - 47.76) MB47.81 ± (47.75 - 47.88) MB+0.2%✅⬆️
runtime.dotnet.threads.count29 ± (29 - 29)29 ± (28 - 29)-1.3%
Comparison explanation

Execution-time benchmarks measure the whole time it takes to execute a program, and are intended to measure the one-off costs. Cases where the execution time results for the PR are worse than latest master results are highlighted in **red**. The following thresholds were used for comparing the execution times:

  • Welch test with statistical test for significance of 5%
  • Only results indicating a difference greater than 5% and 5 ms are considered.

Note that these results are based on a single point-in-time result for each branch. For full results, see the dashboard.

Graphs show the p99 interval based on the mean and StdDev of the test run, as well as the mean value of the run (shown as a diamond below the graph).

Duration charts
FakeDbCommand (.NET Framework 4.8)
gantt
    title Execution time (ms) FakeDbCommand (.NET Framework 4.8)
    dateFormat  x
    axisFormat %Q
    todayMarker off
    section Baseline
    This PR (8173) - mean (77ms)  : 74, 79
    master - mean (77ms)  : 74, 79

    section Bailout
    This PR (8173) - mean (81ms)  : 79, 83
    master - mean (81ms)  : 79, 83

    section CallTarget+Inlining+NGEN
    This PR (8173) - mean (1,100ms)  : 1053, 1147
    master - mean (1,101ms)  : 1052, 1150

Loading
FakeDbCommand (.NET Core 3.1)
gantt
    title Execution time (ms) FakeDbCommand (.NET Core 3.1)
    dateFormat  x
    axisFormat %Q
    todayMarker off
    section Baseline
    This PR (8173) - mean (119ms)  : 115, 123
    master - mean (119ms)  : 116, 122

    section Bailout
    This PR (8173) - mean (121ms)  : 118, 125
    master - mean (120ms)  : 118, 123

    section CallTarget+Inlining+NGEN
    This PR (8173) - mean (783ms)  : 716, 850
    master - mean (786ms)  : 717, 854

Loading
FakeDbCommand (.NET 6)
gantt
    title Execution time (ms) FakeDbCommand (.NET 6)
    dateFormat  x
    axisFormat %Q
    todayMarker off
    section Baseline
    This PR (8173) - mean (108ms)  : 105, 111
    master - mean (107ms)  : 103, 110

    section Bailout
    This PR (8173) - mean (108ms)  : 105, 111
    master - mean (108ms)  : 104, 112

    section CallTarget+Inlining+NGEN
    This PR (8173) - mean (773ms)  : 698, 848
    master - mean (766ms)  : 686, 847

Loading
FakeDbCommand (.NET 8)
gantt
    title Execution time (ms) FakeDbCommand (.NET 8)
    dateFormat  x
    axisFormat %Q
    todayMarker off
    section Baseline
    This PR (8173) - mean (106ms)  : 103, 108
    master - mean (105ms)  : 102, 107

    section Bailout
    This PR (8173) - mean (106ms)  : 103, 108
    master - mean (107ms)  : 105, 110

    section CallTarget+Inlining+NGEN
    This PR (8173) - mean (690ms)  : 668, 711
    master - mean (690ms)  : 665, 715

Loading
HttpMessageHandler (.NET Framework 4.8)
gantt
    title Execution time (ms) HttpMessageHandler (.NET Framework 4.8)
    dateFormat  x
    axisFormat %Q
    todayMarker off
    section Baseline
    This PR (8173) - mean (201ms)  : 192, 210
    master - mean (199ms)  : 191, 206

    section Bailout
    This PR (8173) - mean (207ms)  : 198, 216
    master - mean (202ms)  : 198, 207

    section CallTarget+Inlining+NGEN
    This PR (8173) - mean (1,183ms)  : 1114, 1253
    master - mean (1,169ms)  : 1106, 1232

Loading
HttpMessageHandler (.NET Core 3.1)
gantt
    title Execution time (ms) HttpMessageHandler (.NET Core 3.1)
    dateFormat  x
    axisFormat %Q
    todayMarker off
    section Baseline
    This PR (8173) - mean (291ms)  : 280, 302
    master - mean (305ms)  : 290, 320

    section Bailout
    This PR (8173) - mean (290ms)  : 280, 301
    master - mean (297ms)  : 282, 311

    section CallTarget+Inlining+NGEN
    This PR (8173) - mean (961ms)  : 909, 1013
    master - mean (977ms)  : 924, 1030

Loading
HttpMessageHandler (.NET 6)
gantt
    title Execution time (ms) HttpMessageHandler (.NET 6)
    dateFormat  x
    axisFormat %Q
    todayMarker off
    section Baseline
    This PR (8173) - mean (282ms)  : 267, 297
    master - mean (290ms)  : 278, 303

    section Bailout
    This PR (8173) - mean (288ms)  : 270, 306
    master - mean (291ms)  : 279, 303

    section CallTarget+Inlining+NGEN
    This PR (8173) - mean (958ms)  : 918, 999
    master - mean (963ms)  : 913, 1013

Loading
HttpMessageHandler (.NET 8)
gantt
    title Execution time (ms) HttpMessageHandler (.NET 8)
    dateFormat  x
    axisFormat %Q
    todayMarker off
    section Baseline
    This PR (8173) - mean (278ms)  : 266, 290
    master - mean (290ms)  : 274, 306

    section Bailout
    This PR (8173) - mean (279ms)  : 268, 289
    master - mean (284ms)  : 269, 299

    section CallTarget+Inlining+NGEN
    This PR (8173) - mean (863ms)  : 815, 910
    master - mean (866ms)  : 831, 901

Loading

@lucaspimentel lucaspimentel force-pushed the lpimentel/ai-skills/azure-functions branch 2 times, most recently from ec003e5 to a3f103f Compare February 10, 2026 22:31
@lucaspimentel lucaspimentel changed the title Add Azure Functions skill for workflow automation Add Azure Functions development workflow skill and scripts Feb 10, 2026
@lucaspimentel lucaspimentel force-pushed the lpimentel/ai-skills/azure-functions branch 2 times, most recently from dd7b807 to e998fb1 Compare February 11, 2026 23:41
@lucaspimentel lucaspimentel changed the title Add Azure Functions development workflow skill and scripts [Claude] Add Azure Functions development workflow skill and scripts Feb 12, 2026
@lucaspimentel lucaspimentel force-pushed the lpimentel/ai-skills/azure-functions branch from e998fb1 to cd3e78c Compare February 12, 2026 20:46
@lucaspimentel lucaspimentel force-pushed the lpimentel/ai-skills/azure-functions branch from 5e318e6 to 5ad4c4d Compare February 13, 2026 21:25
@lucaspimentel lucaspimentel changed the title [Claude] Add Azure Functions development workflow skill and scripts Add Azure Functions development workflow skill and scripts Feb 17, 2026
@lucaspimentel lucaspimentel changed the title Add Azure Functions development workflow skill and scripts [Claude] Add Azure Functions development workflow skill and scripts Feb 17, 2026
@lucaspimentel lucaspimentel force-pushed the lpimentel/ai-skills/azure-functions branch 2 times, most recently from ebaa387 to b3e14a6 Compare February 17, 2026 21:00
@lucaspimentel lucaspimentel changed the title [Claude] Add Azure Functions development workflow skill and scripts [Azure Functions] Add dev/test workflow skill and scripts Feb 17, 2026
@lucaspimentel lucaspimentel changed the title [Azure Functions] Add dev/test workflow skill and scripts [Claude][Azure Functions] Add dev/test workflow skill and scripts Feb 17, 2026
@lucaspimentel lucaspimentel added the AI Generated Largely based on code generated by an AI or LLM. This label is the same across all dd-trace-* repos label Feb 17, 2026
@lucaspimentel lucaspimentel marked this pull request as ready for review February 19, 2026 22:13
@lucaspimentel lucaspimentel requested review from a team as code owners February 19, 2026 22:13
Copy link

@chatgpt-codex-connector chatgpt-codex-connector bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: bb470e5339

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

@pr-commenter

This comment was marked as off-topic.

@lucaspimentel lucaspimentel force-pushed the lpimentel/ai-skills/azure-functions branch from d40d96d to eb591f1 Compare February 20, 2026 16:45
Use SemVer-compliant version without dots in prerelease:
- Old: 3.38.0-dev.20260209.143022
- New: 3.38.0-dev20260209143022

Fixes MSB4018 error with stricter version validation.

🤖 Co-Authored-By: Claude Code <noreply@anthropic.com>
Check for required native/managed files when -BuildId
not provided. Fails with helpful error message if
files are missing.

🤖 Co-Authored-By: Claude Code <noreply@anthropic.com>
Specify -OutputPath $env:TEMP in Get-AzureFunctionLogs.ps1 examples
to save downloaded logs to system temp folder instead of cluttering
the repository directory.

🤖 Co-Authored-By: Claude Code <noreply@anthropic.com>
- Add environment-variables.md with complete reference for Azure Functions configuration
- Document required, recommended, and debugging variables
- Add Windows-specific paths (C:\home\site\wwwroot vs /home/site/wwwroot)
- Add /azure-functions configure command to SKILL.md
- Include platform detection and interactive configuration workflow
- Update README.md and SKILL.md with references to new guide

🤖 Co-Authored-By: Claude Code <noreply@anthropic.com>
Added PowerShell script to search for nuget.config up the directory
hierarchy. Updated skill documentation to reference the script in
deployment workflow and scripts reference.

🤖 Co-Authored-By: Claude Code <noreply@anthropic.com>
🤖 Co-Authored-By: Claude Code <noreply@anthropic.com>
🤖 Co-Authored-By: Claude Code <noreply@anthropic.com>
🤖 Co-Authored-By: Claude Code <noreply@anthropic.com>
- Rename build command to build-nuget everywhere
- Add missing allowed-tools (pwsh, publish, restart, webapp log download)
- Fix case-sensitive log path /home/LogFiles/Datadog -> /home/LogFiles/datadog
- Fix wrong CLI command az functionapp logs download -> az webapp log download
- Update .csproj step to verify state before modifying
- Fix net6.0+net461 docs (only net6.0 is built)
- Add missing -OutputPath $env:TEMP in pipeline example
- Remove references to non-existent scripts

🤖 Co-Authored-By: Claude Code <noreply@anthropic.com>
- Reframe skill.md/README.md as dev/test workflow for tracer engineers
- Add test command (trigger discovery + timestamp capture)
- Add trace command with Get-DatadogTrace.ps1/Get-DatadogLogs.ps1
- Fix wrong log file patterns in environment-variables.md
- Fix "Profiler DLL" -> native profiler library (.so/.dll)
- Remove production-oriented sections (perf tuning, agent config)
- Rewrite Best Practices as dev/test Tips
- Trim scripts-reference.md: remove bash duplicates, add PS script docs
- Trim README.md PowerShell install section
- Add intro to log-analysis-guide.md for manual investigation context

🤖 Co-Authored-By: Claude Code <noreply@anthropic.com>
Update skill documentation to ensure DD_API_KEY is never retrieved,
only checked for existence. Replace grep/list commands with Azure CLI
queries that return only the key name, not the value.

Changes:
- SKILL.md: Update troubleshooting and configure sections
- environment-variables.md: Add safe verification example
- scripts-reference.md: Add existence-check command

🤖 Co-Authored-By: Claude Code <noreply@anthropic.com>
🤖 Co-Authored-By: Claude Code <noreply@anthropic.com>
Use Azure CLI --query to exclude DD_API_KEY at the source instead
of fetching then redacting. The API key value never leaves Azure.

🤖 Co-Authored-By: Claude Code <noreply@anthropic.com>
Extract env var configuration logic from SKILL.md prose
into a reusable PowerShell script with SupportsShouldProcess.
Update SKILL.md and scripts-reference.md to use it.

🤖 Co-Authored-By: Claude Code <noreply@anthropic.com>
🤖 Co-Authored-By: Claude Code <noreply@anthropic.com>
🤖 Co-Authored-By: Claude Code <noreply@anthropic.com>
🤖 Co-Authored-By: Claude Code <noreply@anthropic.com>
🤖 Co-Authored-By: Claude Code <noreply@anthropic.com>
🤖 Co-Authored-By: Claude Code <noreply@anthropic.com>
🤖 Co-Authored-By: Claude Code <noreply@anthropic.com>
@lucaspimentel lucaspimentel force-pushed the lpimentel/ai-skills/azure-functions branch from 313496b to 3e7e971 Compare February 24, 2026 19:13
@pr-commenter
Copy link

pr-commenter bot commented Feb 24, 2026

Benchmarks

Benchmark execution time: 2026-02-24 19:55:52

Comparing candidate commit 3e7e971 in PR branch lpimentel/ai-skills/azure-functions with baseline commit 82b146e in branch master.

Found 13 performance improvements and 10 performance regressions! Performance is the same for 154 metrics, 15 unstable metrics.

scenario:Benchmarks.Trace.AgentWriterBenchmark.WriteAndFlushEnrichedTraces net6.0

  • 🟥 execution_time [+100.993ms; +101.073ms] or [+99.764%; +99.843%]

scenario:Benchmarks.Trace.Asm.AppSecBodyBenchmark.AllCycleMoreComplexBody net6.0

  • 🟥 execution_time [+14.329ms; +18.857ms] or [+7.211%; +9.490%]

scenario:Benchmarks.Trace.Asm.AppSecBodyBenchmark.AllCycleSimpleBody netcoreapp3.1

  • 🟩 execution_time [-24.189ms; -18.182ms] or [-11.058%; -8.312%]

scenario:Benchmarks.Trace.Asm.AppSecEncoderBenchmark.EncodeLegacyArgs net6.0

  • 🟩 execution_time [-24.314ms; -23.903ms] or [-12.049%; -11.846%]

scenario:Benchmarks.Trace.Asm.AppSecWafBenchmark.RunWafRealisticBenchmarkWithAttack net6.0

  • 🟩 execution_time [-46.198µs; -16.993µs] or [-13.647%; -5.020%]
  • 🟩 throughput [+179.244op/s; +374.728op/s] or [+6.001%; +12.546%]

scenario:Benchmarks.Trace.AspNetCoreBenchmark.SendRequest net6.0

  • 🟩 execution_time [-34.130ms; -32.678ms] or [-27.009%; -25.859%]

scenario:Benchmarks.Trace.CIVisibilityProtocolWriterBenchmark.WriteAndFlushEnrichedTraces net6.0

  • 🟩 execution_time [-71.935ms; -66.693ms] or [-29.326%; -27.189%]
  • 🟩 throughput [+68.593op/s; +99.334op/s] or [+5.004%; +7.247%]

scenario:Benchmarks.Trace.CIVisibilityProtocolWriterBenchmark.WriteAndFlushEnrichedTraces netcoreapp3.1

  • 🟥 execution_time [+28.808ms; +40.550ms] or [+15.948%; +22.449%]
  • 🟥 throughput [-247.466op/s; -156.536op/s] or [-14.658%; -9.272%]

scenario:Benchmarks.Trace.CharSliceBenchmark.OptimizedCharSlice net6.0

  • 🟩 execution_time [-89.001µs; -80.025µs] or [-5.932%; -5.334%]
  • 🟩 throughput [+37.596op/s; +42.016op/s] or [+5.641%; +6.304%]

scenario:Benchmarks.Trace.CharSliceBenchmark.OriginalCharSlice net472

  • 🟩 execution_time [-145.764µs; -141.009µs] or [-5.247%; -5.076%]
  • 🟩 throughput [+19.262op/s; +19.920op/s] or [+5.351%; +5.534%]

scenario:Benchmarks.Trace.CharSliceBenchmark.OriginalCharSlice net6.0

  • 🟥 execution_time [+105.763µs; +173.531µs] or [+5.465%; +8.967%]
  • 🟥 throughput [-43.745op/s; -26.851op/s] or [-8.457%; -5.191%]

scenario:Benchmarks.Trace.Iast.StringAspectsBenchmark.StringConcatBenchmark net6.0

  • 🟥 throughput [-3492.438op/s; -1515.152op/s] or [-14.991%; -6.504%]

scenario:Benchmarks.Trace.Log4netBenchmark.EnrichedLog netcoreapp3.1

  • 🟥 execution_time [+28.066ms; +31.307ms] or [+16.272%; +18.151%]

scenario:Benchmarks.Trace.RedisBenchmark.SendReceive netcoreapp3.1

  • 🟥 throughput [-34598.953op/s; -24667.241op/s] or [-8.135%; -5.800%]

scenario:Benchmarks.Trace.SingleSpanAspNetCoreBenchmark.SingleSpanAspNetCore netcoreapp3.1

  • 🟩 throughput [+15121882.568op/s; +16238930.461op/s] or [+6.706%; +7.201%]

scenario:Benchmarks.Trace.SpanBenchmark.StartFinishScope netcoreapp3.1

  • 🟩 execution_time [-17.898ms; -12.313ms] or [-8.417%; -5.791%]

scenario:Benchmarks.Trace.SpanBenchmark.StartFinishSpan netcoreapp3.1

  • 🟥 execution_time [+13.149ms; +17.275ms] or [+6.647%; +8.733%]

Copy link
Member

@andrewlock andrewlock left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If it works for you, why not 😄

@lucaspimentel lucaspimentel enabled auto-merge (squash) February 25, 2026 23:51
@lucaspimentel lucaspimentel merged commit a612b49 into master Feb 25, 2026
140 of 142 checks passed
@lucaspimentel lucaspimentel deleted the lpimentel/ai-skills/azure-functions branch February 25, 2026 23:54
@github-actions github-actions bot added this to the vNext-v3 milestone Feb 25, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

AI Generated Largely based on code generated by an AI or LLM. This label is the same across all dd-trace-* repos area:docs

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants