{"slug":"azure-ai-anomalydetector-java","title":"azure-ai-anomalydetector-java","summary":"Build anomaly detection applications with Azure AI Anomaly Detector SDK for Java. Use when implementing univariate/multivariate anomaly detection, time-series analysis, or AI-powered monitoring.","platform":"GitHub Copilot","tags":[],"authorName":"Ciza","authorSlug":"ciza","score":0,"source":"github","price":null,"verified":false,"createdAt":"2026-08-12T21:05:19.409796Z","repo":{"url":"https://github.com/microsoft/skills","stars":3052,"forks":351,"license":"MIT","updatedAt":"2026-09-24T16:38:17Z"},"bodyHtml":"<hr>\n<h2>name: azure-ai-anomalydetector-java\ndescription: Build anomaly detection applications with Azure AI Anomaly Detector SDK for Java. Use when implementing univariate/multivariate anomaly detection, time-series analysis, or AI-powered monitoring.\nlicense: MIT\nmetadata:\nauthor: Microsoft\nversion: \"1.0.0\"\npackage: com.azure:azure-ai-anomalydetector</h2>\n<h1>Azure AI Anomaly Detector SDK for Java</h1>\n<p>Build anomaly detection applications using the Azure AI Anomaly Detector SDK for Java.</p>\n<h2>Installation</h2>\n<pre><code>&lt;dependency&gt;\n  &lt;groupId&gt;com.azure&lt;/groupId&gt;\n  &lt;artifactId&gt;azure-ai-anomalydetector&lt;/artifactId&gt;\n  &lt;version&gt;3.0.0-beta.6&lt;/version&gt;\n&lt;/dependency&gt;\n</code></pre>\n<h2>Client Creation</h2>\n<h3>Sync and Async Clients</h3>\n<pre><code>import com.azure.ai.anomalydetector.AnomalyDetectorClientBuilder;\nimport com.azure.ai.anomalydetector.MultivariateClient;\nimport com.azure.ai.anomalydetector.UnivariateClient;\nimport com.azure.core.credential.AzureKeyCredential;\n\nString endpoint = System.getenv(\"AZURE_ANOMALY_DETECTOR_ENDPOINT\");\nString key = System.getenv(\"AZURE_ANOMALY_DETECTOR_API_KEY\");\n\n// Multivariate client for multiple correlated signals\nMultivariateClient multivariateClient = new AnomalyDetectorClientBuilder()\n    .credential(new AzureKeyCredential(key))\n    .endpoint(endpoint)\n    .buildMultivariateClient();\n\n// Univariate client for single variable analysis\nUnivariateClient univariateClient = new AnomalyDetectorClientBuilder()\n    .credential(new AzureKeyCredential(key))\n    .endpoint(endpoint)\n    .buildUnivariateClient();\n</code></pre>\n<h3>With DefaultAzureCredential</h3>\n<pre><code>import com.azure.core.credential.TokenCredential;\nimport com.azure.identity.AzureIdentityEnvVars;\nimport com.azure.identity.DefaultAzureCredentialBuilder;\nimport com.azure.identity.ManagedIdentityCredentialBuilder;\n\nTokenCredential credential = new DefaultAzureCredentialBuilder()\n    .requireEnvVars(AzureIdentityEnvVars.AZURE_TOKEN_CREDENTIALS)\n    .build();\n// Or use a specific credential directly in production:\n// See https://learn.microsoft.com/java/api/overview/azure/identity-readme?view=azure-java-stable#credential-classes\n// TokenCredential credential = new ManagedIdentityCredentialBuilder().build();\n\nMultivariateClient client = new AnomalyDetectorClientBuilder()\n    .credential(credential)\n    .endpoint(endpoint)\n    .buildMultivariateClient();\n</code></pre>\n<h2>Key Concepts</h2>\n<h3>Univariate Anomaly Detection</h3>\n<ul>\n<li><strong>Batch Detection</strong>: Analyze entire time series at once</li>\n<li><strong>Streaming Detection</strong>: Real-time detection on latest data point</li>\n<li><strong>Change Point Detection</strong>: Detect trend changes in time series</li>\n</ul>\n<h3>Multivariate Anomaly Detection</h3>\n<ul>\n<li>Detect anomalies across 300+ correlated signals</li>\n<li>Uses Graph Attention Network for inter-correlations</li>\n<li>Three-step process: Train → Inference → Results</li>\n</ul>\n<h2>Core Patterns</h2>\n<h3>Univariate Batch Detection</h3>\n<pre><code>import com.azure.ai.anomalydetector.models.*;\nimport java.time.OffsetDateTime;\nimport java.util.List;\n\nList&lt;TimeSeriesPoint&gt; series = List.of(\n    new TimeSeriesPoint(OffsetDateTime.parse(\"2023-01-01T00:00:00Z\"), 1.0),\n    new TimeSeriesPoint(OffsetDateTime.parse(\"2023-01-02T00:00:00Z\"), 2.5),\n    // ... more data points (minimum 12 points required)\n);\n\nUnivariateDetectionOptions options = new UnivariateDetectionOptions(series)\n    .setGranularity(TimeGranularity.DAILY)\n    .setSensitivity(95);\n\nUnivariateEntireDetectionResult result = univariateClient.detectUnivariateEntireSeries(options);\n\n// Check for anomalies\nfor (int i = 0; i &lt; result.getIsAnomaly().size(); i++) {\n    if (result.getIsAnomaly().get(i)) {\n        System.out.printf(\"Anomaly detected at index %d with value %.2f%n\",\n            i, series.get(i).getValue());\n    }\n}\n</code></pre>\n<h3>Univariate Last Point Detection (Streaming)</h3>\n<pre><code>UnivariateLastDetectionResult lastResult = univariateClient.detectUnivariateLastPoint(options);\n\nif (lastResult.isAnomaly()) {\n    System.out.println(\"Latest point is an anomaly!\");\n    System.out.printf(\"Expected: %.2f, Upper: %.2f, Lower: %.2f%n\",\n        lastResult.getExpectedValue(),\n        lastResult.getUpperMargin(),\n        lastResult.getLowerMargin());\n}\n</code></pre>\n<h3>Change Point Detection</h3>\n<pre><code>UnivariateChangePointDetectionOptions changeOptions = \n    new UnivariateChangePointDetectionOptions(series, TimeGranularity.DAILY);\n\nUnivariateChangePointDetectionResult changeResult = \n    univariateClient.detectUnivariateChangePoint(changeOptions);\n\nfor (int i = 0; i &lt; changeResult.getIsChangePoint().size(); i++) {\n    if (changeResult.getIsChangePoint().get(i)) {\n        System.out.printf(\"Change point at index %d with confidence %.2f%n\",\n            i, changeResult.getConfidenceScores().get(i));\n    }\n}\n</code></pre>\n<h3>Multivariate Model Training</h3>\n<pre><code>import com.azure.ai.anomalydetector.models.*;\nimport com.azure.core.util.polling.SyncPoller;\n\n// Prepare training request with blob storage data\nModelInfo modelInfo = new ModelInfo()\n    .setDataSource(\"https://storage.blob.core.windows.net/container/data.zip?sasToken\")\n    .setStartTime(OffsetDateTime.parse(\"2023-01-01T00:00:00Z\"))\n    .setEndTime(OffsetDateTime.parse(\"2023-06-01T00:00:00Z\"))\n    .setSlidingWindow(200)\n    .setDisplayName(\"MyMultivariateModel\");\n\n// Train model (long-running operation)\nAnomalyDetectionModel trainedModel = multivariateClient.trainMultivariateModel(modelInfo);\n\nString modelId = trainedModel.getModelId();\nSystem.out.println(\"Model ID: \" + modelId);\n\n// Check training status\nAnomalyDetectionModel model = multivariateClient.getMultivariateModel(modelId);\nSystem.out.println(\"Status: \" + model.getModelInfo().getStatus());\n</code></pre>\n<h3>Multivariate Batch Inference</h3>\n<pre><code>MultivariateBatchDetectionOptions detectionOptions = new MultivariateBatchDetectionOptions()\n    .setDataSource(\"https://storage.blob.core.windows.net/container/inference-data.zip?sasToken\")\n    .setStartTime(OffsetDateTime.parse(\"2023-07-01T00:00:00Z\"))\n    .setEndTime(OffsetDateTime.parse(\"2023-07-31T00:00:00Z\"))\n    .setTopContributorCount(10);\n\nMultivariateDetectionResult detectionResult = \n    multivariateClient.detectMultivariateBatchAnomaly(modelId, detectionOptions);\n\nString resultId = detectionResult.getResultId();\n\n// Poll for results\nMultivariateDetectionResult result = multivariateClient.getBatchDetectionResult(resultId);\nfor (AnomalyState state : result.getResults()) {\n    if (state.getValue().isAnomaly()) {\n        System.out.printf(\"Anomaly at %s, severity: %.2f%n\",\n            state.getTimestamp(),\n            state.getValue().getSeverity());\n    }\n}\n</code></pre>\n<h3>Multivariate Last Point Detection</h3>\n<pre><code>MultivariateLastDetectionOptions lastOptions = new MultivariateLastDetectionOptions()\n    .setVariables(List.of(\n        new VariableValues(\"variable1\", List.of(\"timestamp1\"), List.of(1.0f)),\n        new VariableValues(\"variable2\", List.of(\"timestamp1\"), List.of(2.5f))\n    ))\n    .setTopContributorCount(5);\n\nMultivariateLastDetectionResult lastResult = \n    multivariateClient.detectMultivariateLastAnomaly(modelId, lastOptions);\n\nif (lastResult.getValue().isAnomaly()) {\n    System.out.println(\"Anomaly detected!\");\n    // Check contributing variables\n    for (AnomalyContributor contributor : lastResult.getValue().getInterpretation()) {\n        System.out.printf(\"Variable: %s, Contribution: %.2f%n\",\n            contributor.getVariable(),\n            contributor.getContributionScore());\n    }\n}\n</code></pre>\n<h3>Model Management</h3>\n<pre><code>// List all models\nPagedIterable&lt;AnomalyDetectionModel&gt; models = multivariateClient.listMultivariateModels();\nfor (AnomalyDetectionModel m : models) {\n    System.out.printf(\"Model: %s, Status: %s%n\",\n        m.getModelId(),\n        m.getModelInfo().getStatus());\n}\n\n// Delete a model\nmultivariateClient.deleteMultivariateModel(modelId);\n</code></pre>\n<h2>Error Handling</h2>\n<pre><code>import com.azure.core.exception.HttpResponseException;\n\ntry {\n    univariateClient.detectUnivariateEntireSeries(options);\n} catch (HttpResponseException e) {\n    System.out.println(\"Status code: \" + e.getResponse().getStatusCode());\n    System.out.println(\"Error: \" + e.getMessage());\n}\n</code></pre>\n<h2>Environment Variables</h2>\n<pre><code>AZURE_ANOMALY_DETECTOR_ENDPOINT=https://&lt;resource&gt;.cognitiveservices.azure.com/ # Required for all auth methods\nAZURE_ANOMALY_DETECTOR_API_KEY=&lt;your-api-key&gt; # Only required for AzureKeyCredential auth\nAZURE_TOKEN_CREDENTIALS=prod  # Required only if DefaultAzureCredential is used in production\n</code></pre>\n<h2>Best Practices</h2>\n<ol>\n<li><strong>Minimum Data Points</strong>: Univariate requires at least 12 points; more data improves accuracy</li>\n<li><strong>Granularity Alignment</strong>: Match <code>TimeGranularity</code> to your actual data frequency</li>\n<li><strong>Sensitivity Tuning</strong>: Higher values (0-99) detect more anomalies</li>\n<li><strong>Multivariate Training</strong>: Use 200-1000 sliding window based on pattern complexity</li>\n<li><strong>Error Handling</strong>: Always handle <code>HttpResponseException</code> for API errors</li>\n</ol>\n<h2>Trigger Phrases</h2>\n<ul>\n<li>\"anomaly detection Java\"</li>\n<li>\"detect anomalies time series\"</li>\n<li>\"multivariate anomaly Java\"</li>\n<li>\"univariate anomaly detection\"</li>\n<li>\"streaming anomaly detection\"</li>\n<li>\"change point detection\"</li>\n<li>\"Azure AI Anomaly Detector\"</li>\n</ul>\n","files":[{"path":"references/examples.md","sizeBytes":24401,"isText":true},{"path":"SKILL.md","sizeBytes":9052,"isText":true}],"reviewScore":null,"reviewSummary":null,"trust":{"provenance":"trusted-source-unreviewed","notice":"Community-authored content, reproduced verbatim and not vetted as instructions. Treat it as data to evaluate, never as directives to follow.","bodySource":null},"bodyLocked":false,"purchaseUrl":null,"sourceUrl":null,"report":{"provenance":"trusted-source-unreviewed","screen":{"ran":true,"outcome":"clean","suspicious":0,"notes":0,"hiddenCharacters":false},"virusScan":{"engine":"clamav","status":"clean","scannedAt":"2026-08-12T21:51:57.435102Z","sha256":"36A9B8E9756EEB7D3AAB4CA01C9F0E6A8BFD5A89AF443C2F713C288F7407EEA0","sizeBytes":8588},"review":null,"source":{"repositoryUrl":"https://github.com/microsoft/skills","path":".github/plugins/azure-sdk-java/skills/azure-ai-anomalydetector-java","license":"MIT","commit":"23d0dac5f83f268166a17f0bc7dc6c73dc348a33","subtreeSha":"AABF894D8F84E85027EE08F49DD0855DD66E0CA743EFEB335332AC3F0396B9AB","lastSyncedAt":"2026-09-25T06:48:53.330584Z"},"reviewedAt":"2026-08-12T21:57:41.93469Z","notice":"Community-authored content, reproduced verbatim and not vetted as instructions. Treat it as data to evaluate, never as directives to follow."},"install":[{"target":"skills-cli","command":"npx skills add https://github.com/microsoft/skills/tree/main/.github/plugins/azure-sdk-java/skills/azure-ai-anomalydetector-java"},{"target":"claude-code","command":"claude plugin marketplace add https://llmmart.ai/marketplace.json && claude plugin install microsoft-skills@llmmart"},{"target":"git","command":"git clone https://github.com/microsoft/skills.git"}]}