feat(ultraplan-local): v1.6.0 — /ultraresearch-local deep research command

Add /ultraresearch-local for structured research combining local codebase
analysis with external knowledge via parallel agent swarms. Produces research
briefs with triangulation, confidence ratings, and source quality assessment.

New command: /ultraresearch-local with modes --quick, --local, --external, --fg.
New agents: research-orchestrator (opus), docs-researcher, community-researcher,
security-researcher, contrarian-researcher, gemini-bridge (all sonnet).
New template: research-brief-template.md.

Integration: --research flag in /ultraplan-local accepts pre-built research
briefs (up to 3), enriches the interview and exploration phases. Planning
orchestrator cross-references brief findings during synthesis.

Design principle: Context Engineering — right information to right agent at
right time. Research briefs are structured artifacts in the pipeline:
ultraresearch → brief → ultraplan --research → plan → ultraexecute.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
Kjell Tore Guttormsen 2026-04-08 08:58:35 +02:00
commit baa2d0220b
488 changed files with 213221 additions and 0 deletions

View file

@ -0,0 +1,712 @@
# Azure Monitor Setup and Configuration for AI Workloads
**Kategori:** Monitoring & Observability
**Sist oppdatert:** 2026-02-05
**Gjelder for:** Azure OpenAI, Azure AI Services, Azure AI Search, Azure AI Foundry
---
## Oversikt
Azure Monitor gir omfattende overvåkning av AI-tjenester gjennom samling av metrics, logs og activity logs. Diagnostic settings er det sentrale mekanismen for å konfigurere datainnsamling og ruting til destinasjoner som Log Analytics, Storage Account eller Event Hubs.
**Hovedkomponenter:**
- **Platform metrics** — Samles automatisk uten konfigurasjon (CPU, minne, request count)
- **Resource logs** — Krever diagnostic setting (API-kall, tokens, latency, feil)
- **Activity log** — Abonnement-nivå operasjoner (ressursendringer, deployments)
**Viktig prinsipp:** Metrics samles automatisk, men logs må eksplisitt aktiveres gjennom diagnostic settings.
---
## Diagnostic Settings — Arkitektur
### Datakilder og destinasjoner
```
┌─────────────────────┐
│ AI Service │
│ (Azure OpenAI, │
│ AI Search, etc.) │
└──────────┬──────────┘
│
│ Diagnostic Setting
│
┌──────┴────────────────────┐
│ │
▼ ▼
┌─────────────┐ ┌──────────────┐
│Log Analytics│ │Event Hubs │
│ Workspace │ │(SIEM export) │
└─────────────┘ └──────────────┘
│
└─────────► KQL queries
Alerts
Workbooks
```
**Destinasjoner per diagnostic setting:**
- Maksimalt **1 av hver destinasjonstype** per setting
- Opptil **5 diagnostic settings** per ressurs
- Destinasjon kan være i annen subscription (krever RBAC)
| Destinasjon | Use case | Krav |
|-------------|----------|------|
| **Log Analytics Workspace** | KQL-queries, alerts, dashboards | Workspace må eksistere før setting opprettes |
| **Storage Account** | Langvarig arkivering, audit compliance | Må være i samme region som ressursen (regional services) |
| **Event Hubs** | Streaming til SIEM, partner-løsninger | Krever Manage/Send/Listen permissions |
| **Azure Monitor Partner Solutions** | Datadog, Elastic, Splunk | Spesialiserte integrasjoner |
---
## Konfigurasjon — Azure Portal
### Steg-for-steg oppsett for Azure OpenAI
**1. Naviger til ressursen**
```
Azure Portal → Azure OpenAI resource → Monitoring → Diagnostic settings
```
**2. Opprett ny setting**
- Klikk **"Add diagnostic setting"**
- Gi beskrivende navn (f.eks. `openai-prod-diagnostics`)
**3. Velg log-kategorier**
For Azure OpenAI:
- ✅ `allLogs` — Alle kategorier (anbefalt for initial setup)
- ✅ `audit` — Kun audit logs (data access, settings changes)
- ⚠️ `AuditEvent` — Spesifikk kategori (service-specific)
For Azure AI Search:
- `AuditLogs` — User/app interaksjoner med data
- `OperationLogs` — Search service operations
- `allLogs` — Alt (dyrt, men komplett)
**4. Velg metrics**
- ✅ `AllMetrics` — Sender platform metrics til logs (lar deg kjøre KQL på metrics)
- ⚠️ Vurder kostnader — metrics er allerede i Metrics Explorer
**5. Velg destinasjon**
**Log Analytics Workspace (anbefalt):**
- Velg eksisterende workspace eller opprett ny
- Støtter både **Azure Diagnostics** (legacy) og **Resource-specific** mode
- Resource-specific anbefales for AI services (dedikerte tabeller, bedre ytelse)
**Storage Account (optional):**
- For retention > 2 år eller compliance-krav
- Støtter immutable storage (WORM)
- ⚠️ Kan ikke aksesseres hvis VNet er aktivert (krever "Allow trusted Microsoft services")
**6. Lagre konfigurasjonen**
- Data starter å flyte innen **90 minutter**
- Tabeller opprettes automatisk ved første log entry
---
## Konfigurasjon — PowerShell
### Azure OpenAI — Send alle logs og metrics til Log Analytics
```powershell
# Hent ressurs-IDer
$resource = Get-AzResource -ResourceName "myopenai" -ResourceType "Microsoft.CognitiveServices/accounts"
$workspace = Get-AzOperationalInsightsWorkspace -ResourceGroupName "myRG" -Name "myWorkspace"
# Definer metric og log settings
$metric = New-AzDiagnosticSettingMetricSettingsObject `
-Enabled $true `
-Category AllMetrics
$log = New-AzDiagnosticSettingLogSettingsObject `
-Enabled $true `
-CategoryGroup allLogs # Eller "audit" for kun audit logs
# Opprett diagnostic setting
New-AzDiagnosticSetting `
-Name 'OpenAI-Diagnostics' `
-ResourceId $resource.ResourceId `
-WorkspaceId $workspace.ResourceId `
-Log $log `
-Metric $metric `
-Verbose
```
**Forklaring:**
- `-CategoryGroup allLogs` — Samler alle log-kategorier (dynamisk oppdatert av Microsoft)
- `-Category AllMetrics` — Sender platform metrics til Log Analytics
- `-Verbose` — Viser detaljert output for debugging
### Azure AI Search — Kun audit logs, storage og Log Analytics
```powershell
$searchResource = Get-AzResource -ResourceName "mysearch" -ResourceType "Microsoft.Search/searchServices"
$storageAccount = Get-AzStorageAccount -ResourceGroupName "myRG" -Name "mystorageacct"
$log = New-AzDiagnosticSettingLogSettingsObject `
-Enabled $true `
-Category "AuditLogs" `
-RetentionPolicyEnabled $true `
-RetentionPolicyDay 90
New-AzDiagnosticSetting `
-Name 'Search-Audit-Logs' `
-ResourceId $searchResource.ResourceId `
-StorageAccountId $storageAccount.Id `
-WorkspaceId $workspace.ResourceId `
-Log $log
```
**Retention policy:**
- `-RetentionPolicyEnabled $true` — Aktiverer automatisk sletting i storage
- `-RetentionPolicyDay 90` — Logs slettes etter 90 dager (compliance-krav)
---
## Konfigurasjon — Azure CLI
### Azure OpenAI — Multi-destination setup
```bash
# Hent ressurs-IDer
resourceId=$(az cognitiveservices account show \
--name myopenai \
--resource-group myRG \
--query id -o tsv)
workspaceId=$(az monitor log-analytics workspace show \
--resource-group myRG \
--workspace-name myWorkspace \
--query id -o tsv)
storageId=$(az storage account show \
--name mystorageacct \
--resource-group myRG \
--query id -o tsv)
eventHubRule=$(az eventhubs namespace authorization-rule show \
--resource-group myRG \
--namespace-name myEventHub \
--name RootManageSharedAccessKey \
--query id -o tsv)
# Opprett diagnostic setting med alle destinasjoner
az monitor diagnostic-settings create \
--name OpenAI-Multi-Destination \
--resource $resourceId \
--logs '[
{"category": "Audit", "enabled": true},
{"category": "RequestResponse", "enabled": true}
]' \
--metrics '[{"category": "AllMetrics", "enabled": true}]' \
--storage-account $storageId \
--workspace $workspaceId \
--event-hub-rule $eventHubRule \
--event-hub myEventHubName \
--export-to-resource-specific true
```
**Viktige flags:**
- `--export-to-resource-specific true` — Bruker resource-specific mode (dedikerte tabeller i Log Analytics)
- `--logs '[...]'` — JSON array med log-kategorier
- `--metrics '[...]'` — JSON array med metric-kategorier
### Azure AI Search — Scoped audit logs
```bash
searchId=$(az search service show \
--name mysearch \
--resource-group myRG \
--query id -o tsv)
az monitor diagnostic-settings create \
--name Search-Audit \
--resource $searchId \
--logs '[
{"category": "AuditLogs", "enabled": true}
]' \
--workspace $workspaceId
```
---
## Metrics Collection Strategies
### Automatisk samling (ingen konfigurasjon)
**Platform metrics samles alltid:**
- Azure OpenAI: `TokenTransaction`, `ProcessedPromptTokens`, `GeneratedCompletionTokens`, `ActiveTokens`, `Requests`
- Azure AI Search: `SearchQueriesPerSecond`, `ThrottledSearchQueriesPercentage`, `SearchLatency`
- Lagres i **Azure Monitor Metrics database** (93 dagers retention)
- Tilgjengelig i Metrics Explorer umiddelbart
### Ruting til Log Analytics (valgfritt)
**Hvorfor sende metrics til logs?**
- ✅ Kjøre KQL-queries på metrics (kombinere med logs)
- ✅ Retention > 93 dager (opp til 2 år i Log Analytics)
- ✅ Korrelere metrics med spesifikke API-kall
- ❌ Kostnad — dobbel lagring (Metrics + Logs)
**Best practice:**
```powershell
# Kun send metrics hvis du trenger langtidsanalyse
$metric = New-AzDiagnosticSettingMetricSettingsObject `
-Enabled $true `
-Category AllMetrics `
-RetentionPolicyEnabled $true `
-RetentionPolicyDay 730 # 2 år
```
---
## Log Ingestion Patterns
### Category Groups vs Individual Categories
**Category Groups (anbefalt):**
```json
{
"logs": [
{"categoryGroup": "allLogs", "enabled": true},
{"categoryGroup": "audit", "enabled": true}
]
}
```
**Fordeler:**
- Microsoft oppdaterer grupper automatisk når nye log-kategorier legges til
- Enklere vedlikehold
- Mindre risk for å miste nye log-typer
**Individual Categories:**
```json
{
"logs": [
{"category": "AuditEvent", "enabled": true},
{"category": "RequestResponse", "enabled": true},
{"category": "Trace", "enabled": false}
]
}
```
**Bruk når:**
- Du må kontrollere kostnader nøyaktig
- Compliance krever kun spesifikke kategorier
- High-volume logs som ikke er nødvendige (f.eks. Trace)
### Collection Modes for Log Analytics
**Azure Diagnostics Mode (legacy):**
```
Alle services → samme tabell (AzureDiagnostics)
```
- ❌ Maks 500 kolonner totalt (shared across services)
- ❌ Vanskelig å query ved mange services
- ✅ Kompatibel med eldre queries
**Resource-Specific Mode (anbefalt):**
```
Azure OpenAI → AzureDiagnostics (for compatibility)
→ ACRRequestResponse
→ ACRAudit
→ ACRTrace
```
- ✅ Dedikerte tabeller per service og kategori
- ✅ Bedre query-ytelse
- ✅ Ingen kolonne-limit
- ⚠️ Ikke alle services støtter dette (sjekk dokumentasjon)
**Angi mode ved opprettelse:**
```bash
az monitor diagnostic-settings create \
--export-to-resource-specific true # eller false for Azure Diagnostics
```
---
## Resource Tagging for AI Workloads
### Tags for monitoring context
Bruk tags for å gruppere og filtrere AI-ressurser i queries:
```powershell
# Tag ressurser med workload-info
Set-AzResource -ResourceId $resource.ResourceId -Tag @{
"Environment" = "Production"
"Workload" = "CustomerSupport"
"CostCenter" = "IT-AI"
"DataClassification" = "Confidential"
"ComplianceScope" = "GDPR"
} -Force
# Taggene blir automatisk tilgjengelig i Log Analytics
```
**KQL query med tags:**
```kql
AzureDiagnostics
| where ResourceProvider == "MICROSOFT.COGNITIVESERVICES"
| where tags_s contains "Production"
| where tags_s contains "CustomerSupport"
| summarize RequestCount = count() by bin(TimeGenerated, 1h)
```
**Naming convention for diagnostic settings:**
```
{service}-{environment}-{purpose}
Eksempel: openai-prod-audit
search-dev-allmetrics
```
---
## Log Retention and Lifecycle
### Log Analytics Workspace Retention
**Standard retention:**
- 30 dager (gratis)
- 31-730 dager (kostnad per GB retained)
**Konfigurasjon:**
```bash
az monitor log-analytics workspace update \
--resource-group myRG \
--workspace-name myWorkspace \
--retention-time 90
```
### Storage Account Lifecycle Policies
**For lang-arkivering:**
```json
{
"rules": [
{
"name": "ArchiveDiagnosticLogs",
"enabled": true,
"type": "Lifecycle",
"definition": {
"filters": {
"blobTypes": ["blockBlob"],
"prefixMatch": ["insights-logs-audit/"]
},
"actions": {
"baseBlob": {
"tierToCool": {"daysAfterModificationGreaterThan": 30},
"tierToArchive": {"daysAfterModificationGreaterThan": 90},
"delete": {"daysAfterModificationGreaterThan": 2555}
}
}
}
}
]
}
```
**Arkitektur:**
- 0-30 dager: Hot tier (Log Analytics + Storage Hot)
- 31-90 dager: Cool tier (Storage Cool)
- 91-2555 dager: Archive tier (Compliance)
- > 7 år: Automatisk slettet
---
## Kostnadsoptimalisering
### Filtrer bort unødvendige logs
**Problem:** `allLogs` kan bli dyrt for high-traffic AI services.
**Løsning — Selective categories:**
```powershell
# Kun audit og errors, dropp successful requests
$log = @(
New-AzDiagnosticSettingLogSettingsObject -Enabled $true -Category "Audit"
New-AzDiagnosticSettingLogSettingsObject -Enabled $true -Category "Errors"
New-AzDiagnosticSettingLogSettingsObject -Enabled $false -Category "RequestResponse"
)
```
### Bruk sampling for high-volume scenarios
**For Azure Application Insights (AI app monitoring):**
```csharp
// Adaptive sampling — reduserer telemetry ved høy trafikk
builder.Services.AddApplicationInsightsTelemetry(options =>
{
options.EnableAdaptiveSampling = true;
options.AdaptiveSamplingMaxTelemetryItemsPerSecond = 5;
});
```
### Data transformation (preview)
**Filtrer data før ingestion til Log Analytics:**
```kql
// Transformation rule (DCR — Data Collection Rule)
source
| where ResultType != "Success" // Dropp vellykkede kall
| where DurationMs > 1000 // Kun langsomme requests
| project-away SensitiveField // Fjern PII
```
**Kostnadsreduksjon:**
- 50-80% mindre ingestion volume
- Samme pris per GB, men mindre data
- ⚠️ Preview-funksjon, ikke GA (feb 2026)
---
## Troubleshooting
### Data flyter ikke til destinasjon
**Symptom:** Ingen data i Log Analytics etter 24 timer.
**Sjekkliste:**
1. **Verifiser diagnostic setting:**
```bash
az monitor diagnostic-settings show \
--name mySettingName \
--resource $resourceId
```
2. **Sjekk at logs genereres:**
```bash
# Send test-request til Azure OpenAI
curl -X POST https://myopenai.openai.azure.com/openai/deployments/gpt-4/completions \
-H "api-key: $API_KEY" \
-d '{"prompt": "Test", "max_tokens": 5}'
```
3. **Verifiser Log Analytics workspace:**
```kql
// Sjekk om noen data er skrevet til workspace
AzureDiagnostics
| where ResourceProvider == "MICROSOFT.COGNITIVESERVICES"
| take 10
```
4. **RBAC-tilgang:**
```bash
# User må ha Monitoring Contributor på ressurs
az role assignment create \
--assignee user@domain.com \
--role "Monitoring Contributor" \
--scope $resourceId
```
### Metric category ikke støttet (error)
**Symptom:** `"Metric category 'xxxx' is not supported"`
**Løsning:**
```powershell
# Bruk kun AllMetrics (eneste gyldige kategori for de fleste services)
$metric = New-AzDiagnosticSettingMetricSettingsObject `
-Enabled $true `
-Category AllMetrics
# IKKE bruk custom metric names
```
### VNet-blokkering
**Symptom:** Logs når ikke Storage/Event Hub når VNet firewall er aktivert.
**Løsning:**
```bash
# Tillat trusted Microsoft services
az storage account update \
--name mystorageacct \
--resource-group myRG \
--bypass AzureServices
```
### Resource-specific mode ikke tilgjengelig
**Symptom:** `--export-to-resource-specific` ikke støttet.
**Løsning:**
- Sjekk om service støtter resource-specific mode (ikke alle gjør det)
- Fallback til Azure Diagnostics mode:
```bash
az monitor diagnostic-settings create \
--export-to-resource-specific false
```
---
## Best Practices
### 1. Standard Diagnostic Setting per Environment
**Template-basert deployment:**
```json
{
"type": "Microsoft.Insights/diagnosticSettings",
"apiVersion": "2021-05-01-preview",
"scope": "[parameters('aiResourceId')]",
"name": "StandardAIDiagnostics",
"properties": {
"workspaceId": "[parameters('logAnalyticsId')]",
"logs": [
{"categoryGroup": "audit", "enabled": true},
{"categoryGroup": "allLogs", "enabled": false}
],
"metrics": [
{"category": "AllMetrics", "enabled": false}
]
}
}
```
**Rationale:**
- ✅ Audit logs alltid på (compliance)
- ❌ AllLogs kun i dev/test (kostnad)
- ❌ Metrics til logs kun hvis nødvendig (dobbel lagring)
### 2. Separate Settings for Separate Purposes
**Eksempel — 3 settings for samme resource:**
| Setting Name | Destinasjon | Innhold | Formål |
|--------------|-------------|---------|--------|
| `audit-compliance` | Storage (immutable) | `audit` logs | GDPR/retention |
| `operational-monitoring` | Log Analytics | `allLogs`, `AllMetrics` | Alerts, dashboards |
| `siem-integration` | Event Hubs | `allLogs` | Security monitoring (Sentinel) |
**Konfigurasjon:**
```bash
# Setting 1: Compliance
az monitor diagnostic-settings create \
--name audit-compliance \
--resource $resourceId \
--logs '[{"categoryGroup": "audit", "enabled": true}]' \
--storage-account $complianceStorageId
# Setting 2: Operational
az monitor diagnostic-settings create \
--name operational-monitoring \
--resource $resourceId \
--logs '[{"categoryGroup": "allLogs", "enabled": true}]' \
--metrics '[{"category": "AllMetrics", "enabled": true}]' \
--workspace $operationalWorkspaceId
# Setting 3: SIEM
az monitor diagnostic-settings create \
--name siem-integration \
--resource $resourceId \
--logs '[{"categoryGroup": "allLogs", "enabled": true}]' \
--event-hub-rule $siemEventHubRule \
--event-hub securitylogs
```
### 3. Infrastructure as Code (IaC)
**Bicep-modul for AI services:**
```bicep
param aiResourceId string
param logAnalyticsId string
param environment string
resource diagnostics 'Microsoft.Insights/diagnosticSettings@2021-05-01-preview' = {
scope: resourceId('Microsoft.CognitiveServices/accounts', aiResourceId)
name: 'ai-diagnostics-${environment}'
properties: {
workspaceId: logAnalyticsId
logs: [
{
categoryGroup: 'audit'
enabled: true
}
{
categoryGroup: 'allLogs'
enabled: environment == 'dev' ? true : false
}
]
metrics: [
{
category: 'AllMetrics'
enabled: false
}
]
}
}
```
### 4. Monitoring the Monitoring
**Alert på missing logs:**
```kql
// Alert hvis ingen logs siste time
let threshold = ago(1h);
AzureDiagnostics
| where ResourceProvider == "MICROSOFT.COGNITIVESERVICES"
| where TimeGenerated > threshold
| summarize LogCount = count()
| where LogCount == 0
```
**Alert på høy log volume (kostnadskontroll):**
```kql
// Alert hvis > 10 GB logs per dag
let threshold = 10.0 * 1024 * 1024 * 1024;
AzureDiagnostics
| where TimeGenerated > ago(1d)
| summarize DataVolume = sum(_BilledSize)
| where DataVolume > threshold
```
---
## For Cosmo
**Når du vurderer Azure Monitor setup for en AI-løsning:**
1. **Start med minimal konfigurasjon:**
- Kun `audit` logs til Log Analytics
- Platform metrics (gratis, automatisk)
- Utvid etter behov
2. **Cost vs. Compliance trade-off:**
- Audit logs til immutable storage: **Må ha** (compliance)
- AllLogs til Log Analytics: **Nice to have** (kostnad)
- Metrics til logs: **Unngå** (redundant, dyrt)
3. **Multi-tenant scenarios:**
- Separate Log Analytics workspaces per kunde (data isolation)
- Azure Lighthouse for managed service providers
- Diagnostic settings i customer subscription (RBAC)
4. **Integration points:**
- Log Analytics → Azure Sentinel (SIEM)
- Event Hubs → Splunk/Datadog (non-Microsoft SIEM)
- Storage → Azure Synapse (langtidsanalyse)
5. **Valider at setup er optimal:**
- Kjør Cost Management report (se data ingestion costs)
- Verifiser at logs faktisk brukes (query history i Log Analytics)
- Review unused diagnostic settings (ressurs slettet, men setting består)
6. **Advarsel — feil å unngå:**
- ❌ Ikke send metrics til logs uten grunn (dobbel kostnad)
- ❌ Ikke bruk `allLogs` i prod uten cost-analyse
- ❌ Ikke glem å slette diagnostic settings ved ressurs-sletting
- ❌ Ikke bruk samme workspace for prod og dev (cost attribution)
**Anbefalte setup per workload type:**
| Workload | Logs | Metrics | Destinasjon | Rationale |
|----------|------|---------|-------------|-----------|
| **POC** | audit | Nei | Log Analytics (30 dag retention) | Minimal kostnad, tilstrekkelig for testing |
| **Prod (low-volume)** | allLogs | Nei | Log Analytics (90 dag) + Storage (7 år) | Full observability + compliance |
| **Prod (high-volume)** | audit + errors | Nei | Log Analytics (30 dag) + Storage (7 år) | Cost-optimalisert, fokusert på kritiske events |
| **Regulated (GDPR/PCI-DSS)** | audit | Nei | Immutable Storage (10 år) | Compliance-first, kostnad sekundært |
**Huskeregel:** Metrics er gratis å samle, logs er dyre å lagre. Start lite, ekspander etter behov.