---
title: Obtenir des recommandations SPA
description: Cet endpoint est actuellement expérimental et réservé à un usage interne Datadog uniquement.
breadcrumbs: Documentation > API > Obtenir des recommandations SPA
---

> For the complete documentation index, see [llms.txt](https://dnd37xeb23o8n.cloudfront.net/jen.gilbert/astro-base/llms.txt).

# Obtenir des recommandations SPA

## v2 (latest)

{% alert level="warning" %}
**Note**: This endpoint is in preview and may change in the future. It is not yet recommended for production use.
{% /alert %}

| Datadog site      | API endpoint                                                           |
| ----------------- | ---------------------------------------------------------------------- |
| app.datadoghq.com | GET https://api.datadoghq.com/api/v2/spa/recommendations/{service}     |
| us3.datadoghq.com | GET https://api.us3.datadoghq.com/api/v2/spa/recommendations/{service} |
| us5.datadoghq.com | GET https://api.us5.datadoghq.com/api/v2/spa/recommendations/{service} |
| app.datadoghq.eu  | GET https://api.datadoghq.eu/api/v2/spa/recommendations/{service}      |
| ap1.datadoghq.com | GET https://api.ap1.datadoghq.com/api/v2/spa/recommendations/{service} |
| ap2.datadoghq.com | GET https://api.ap2.datadoghq.com/api/v2/spa/recommendations/{service} |
| uk1.datadoghq.com | GET https://api.uk1.datadoghq.com/api/v2/spa/recommendations/{service} |
| app.ddog-gov.com  | GET https://api.ddog-gov.com/api/v2/spa/recommendations/{service}      |
| us2.ddog-gov.com  | GET https://api.us2.ddog-gov.com/api/v2/spa/recommendations/{service}  |

### Overview

Cet endpoint est actuellement expérimental et réservé à un usage interne Datadog uniquement. Récupérer les recommandations de ressources pour un job Spark. L'appelant (Spark Gateway ou DJM UI) fournit un nom de service et SPA renvoie des recommandations structurées pour les ressources du driver et des executors. La version avec un shard doit être préférée dans la mesure du possible, car elle fournit des résultats plus précis.

### Arguments

#### Path Parameters

| Field                | Type   | Description                       |
| -------------------- | ------ | --------------------------------- |
| service [*required*] | string | The service name for a spark job. |

#### Query Strings

| Field        | Type   | Description                                                  |
| ------------ | ------ | ------------------------------------------------------------ |
| bypass_cache | string | The recommendation service should not use its metrics cache. |

### Response

{% tabs %}
{% tab label="200" %}
OK

{% tabs %}
{% tab label="Model" %}
JSON:API document containing a single Recommendation resource. Returned by SPA when the Spark Gateway requests recommendations.

| Parent field | Field                   | Type   | Description                                                                                                                                                                                                             |
| ------------ | ----------------------- | ------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|              | data [*required*]       | object | JSON:API resource object for SPA Recommendation. Includes type, optional ID, and resource attributes with structured recommendations.                                                                                   |
| data         | attributes [*required*] | object | Attributes of the SPA Recommendation resource. Contains recommendations for both driver and executor components.                                                                                                        |
| attributes   | confidence_level        | double | The confidence level of the recommendation, expressed as a value between 0.0 (low confidence) and 1.0 (high confidence).                                                                                                |
| attributes   | driver [*required*]     | object | Resource recommendation for a single Spark component (driver or executor). Contains estimation data used to patch Spark job specs.                                                                                      |
| driver       | estimation [*required*] | object | Recommended resource values for a Spark driver or executor, derived from recent real usage metrics. Used by SPA to propose more efficient pod sizing.                                                                   |
| estimation   | cpu                     | object | CPU usage statistics derived from historical Spark job metrics. Provides multiple estimates so users can choose between conservative and cost-saving risk profiles.                                                     |
| cpu          | max                     | int64  | Maximum CPU usage observed for the job, expressed in millicores. This represents the upper bound of usage.                                                                                                              |
| cpu          | p75                     | int64  | 75th percentile of CPU usage (millicores). Represents a cost-saving configuration while covering most workloads.                                                                                                        |
| cpu          | p95                     | int64  | 95th percentile of CPU usage (millicores). Balances performance and cost, providing a safer margin than p75.                                                                                                            |
| estimation   | ephemeral_storage       | int64  | Recommended ephemeral storage allocation (in MiB). Derived from job temporary storage patterns.                                                                                                                         |
| estimation   | heap                    | int64  | Recommended JVM heap size (in MiB).                                                                                                                                                                                     |
| estimation   | memory                  | int64  | Recommended total memory allocation (in MiB). Includes both heap and overhead.                                                                                                                                          |
| estimation   | overhead                | int64  | Recommended JVM overhead (in MiB). Computed as total memory - heap.                                                                                                                                                     |
| attributes   | executor [*required*]   | object | Resource recommendation for a single Spark component (driver or executor). Contains estimation data used to patch Spark job specs.                                                                                      |
| executor     | estimation [*required*] | object | Recommended resource values for a Spark driver or executor, derived from recent real usage metrics. Used by SPA to propose more efficient pod sizing.                                                                   |
| estimation   | cpu                     | object | CPU usage statistics derived from historical Spark job metrics. Provides multiple estimates so users can choose between conservative and cost-saving risk profiles.                                                     |
| cpu          | max                     | int64  | Maximum CPU usage observed for the job, expressed in millicores. This represents the upper bound of usage.                                                                                                              |
| cpu          | p75                     | int64  | 75th percentile of CPU usage (millicores). Represents a cost-saving configuration while covering most workloads.                                                                                                        |
| cpu          | p95                     | int64  | 95th percentile of CPU usage (millicores). Balances performance and cost, providing a safer margin than p75.                                                                                                            |
| estimation   | ephemeral_storage       | int64  | Recommended ephemeral storage allocation (in MiB). Derived from job temporary storage patterns.                                                                                                                         |
| estimation   | heap                    | int64  | Recommended JVM heap size (in MiB).                                                                                                                                                                                     |
| estimation   | memory                  | int64  | Recommended total memory allocation (in MiB). Includes both heap and overhead.                                                                                                                                          |
| estimation   | overhead                | int64  | Recommended JVM overhead (in MiB). Computed as total memory - heap.                                                                                                                                                     |
| attributes   | matched_params          | string | Only returned by the v2 endpoint. The job parameters whose values the recommendation was matched on, as `parameter=value` pairs joined by `|`. An empty string means the service-wide (coarse) recommendation was used. |
| data         | id                      | string | Resource identifier for the recommendation. Optional in responses.                                                                                                                                                      |
| data         | type [*required*]       | enum   | JSON:API resource type for Spark Pod Autosizing recommendations. Identifies the Recommendation resource returned by SPA. Allowed enum values: `recommendation`. Default: `recommendation`.                              |
{% /tab %}

{% tab label="Example" %}
```json
{
  "data": {
    "attributes": {
      "confidence_level": "number",
      "driver": {
        "estimation": {
          "cpu": {
            "max": "integer",
            "p75": "integer",
            "p95": "integer"
          },
          "ephemeral_storage": "integer",
          "heap": "integer",
          "memory": "integer",
          "overhead": "integer"
        }
      },
      "executor": {
        "estimation": {
          "cpu": {
            "max": "integer",
            "p75": "integer",
            "p95": "integer"
          },
          "ephemeral_storage": "integer",
          "heap": "integer",
          "memory": "integer",
          "overhead": "integer"
        }
      },
      "matched_params": "detailed_metrics=false|Region=US1"
    },
    "id": "string",
    "type": "recommendation"
  }
}
```
{% /tab %}
{% /tabs %}
{% /tab %}

{% tab label="400" %}
Bad Request

{% tabs %}
{% tab label="Model" %}
API error response.

| Field               | Type     | Description       |
| ------------------- | -------- | ----------------- |
| errors [*required*] | [string] | A list of errors. |
{% /tab %}

{% tab label="Example" %}
```json
{
  "errors": [
    "Bad Request"
  ]
}
```
{% /tab %}
{% /tabs %}
{% /tab %}

{% tab label="403" %}
Not Authorized

{% tabs %}
{% tab label="Model" %}
API error response.

| Field               | Type     | Description       |
| ------------------- | -------- | ----------------- |
| errors [*required*] | [string] | A list of errors. |
{% /tab %}

{% tab label="Example" %}
```json
{
  "errors": [
    "Bad Request"
  ]
}
```
{% /tab %}
{% /tabs %}
{% /tab %}

{% tab label="429" %}
Too many requests

{% tabs %}
{% tab label="Model" %}
API error response.

| Field               | Type     | Description       |
| ------------------- | -------- | ----------------- |
| errors [*required*] | [string] | A list of errors. |
{% /tab %}

{% tab label="Example" %}
```json
{
  "errors": [
    "Bad Request"
  ]
}
```
{% /tab %}
{% /tabs %}
{% /tab %}
{% /tabs %}

### Code Example

{% tabs %}
{% tab label="Curl" %}
```bash
# Path parameters
export service="CHANGE_ME"

# Set your Datadog site and credentials
export DD_SITE="datadoghq.com" # Or us3.datadoghq.com, us5.datadoghq.com, datadoghq.eu, ap1.datadoghq.com, ap2.datadoghq.com, uk1.datadoghq.com, ddog-gov.com, us2.ddog-gov.com
# Use a Personal Access Token or Service Access Token
export DD_BEARER_TOKEN="<PERSONAL_ACCESS_TOKEN OR SERVICE_ACCESS_TOKEN>"

curl -X GET "https://api.${DD_SITE}/api/v2/spa/recommendations/${service}" \
-H "Accept: application/json" \
-H "Authorization: Bearer ${DD_BEARER_TOKEN}"
```
{% /tab %}

{% tab label="Go" %}
```go
// Get SPA Recommendations returns "OK" response

package main

import (
	"context"
	"encoding/json"
	"fmt"
	"os"

	"github.com/DataDog/datadog-api-client-go/v2/api/datadog"
	"github.com/DataDog/datadog-api-client-go/v2/api/datadogV2"
)

func main() {
	ctx := datadog.NewDefaultContext(context.Background())
	ctx = context.WithValue(ctx, datadog.ContextAccessToken, os.Getenv("DD_BEARER_TOKEN"))
	configuration := datadog.NewConfiguration()
	configuration.SetUnstableOperationEnabled("v2.GetSPARecommendations", true)
	apiClient := datadog.NewAPIClient(configuration)
	api := datadogV2.NewSpaApi(apiClient)
	resp, r, err := api.GetSPARecommendations(ctx, "service", *datadogV2.NewGetSPARecommendationsOptionalParameters())

	if err != nil {
		fmt.Fprintf(os.Stderr, "Error when calling `SpaApi.GetSPARecommendations`: %v\n", err)
		fmt.Fprintf(os.Stderr, "Full HTTP response: %v\n", r)
	}

	responseContent, _ := json.MarshalIndent(resp, "", "  ")
	fmt.Fprintf(os.Stdout, "Response from `SpaApi.GetSPARecommendations`:\n%s\n", responseContent)
}
```

#### Instructions

First [install the library and its dependencies](https://dnd37xeb23o8n.cloudfront.net/api/latest.md?code-lang=go) and then save the example to `main.go` and run following commands:

```bash
DD_SITE="datadoghq.com" DD_BEARER_TOKEN="<PERSONAL_ACCESS_TOKEN OR SERVICE_ACCESS_TOKEN>" go run "main.go"
```
{% /tab %}

{% tab label="Java" %}
```java
// Get SPA Recommendations returns "OK" response

import com.datadog.api.client.ApiClient;
import com.datadog.api.client.ApiException;
import com.datadog.api.client.v2.api.SpaApi;
import com.datadog.api.client.v2.model.RecommendationDocument;

public class Example {
  public static void main(String[] args) {
    ApiClient defaultClient = ApiClient.getDefaultApiClient();
    defaultClient.setAccessToken(System.getenv("DD_BEARER_TOKEN"));
    defaultClient.setUnstableOperationEnabled("v2.getSPARecommendations", true);
    SpaApi apiInstance = new SpaApi(defaultClient);

    try {
      RecommendationDocument result = apiInstance.getSPARecommendations("service");
      System.out.println(result);
    } catch (ApiException e) {
      System.err.println("Exception when calling SpaApi#getSPARecommendations");
      System.err.println("Status code: " + e.getCode());
      System.err.println("Reason: " + e.getResponseBody());
      System.err.println("Response headers: " + e.getResponseHeaders());
      e.printStackTrace();
    }
  }
}
```

#### Instructions

First [install the library and its dependencies](https://dnd37xeb23o8n.cloudfront.net/api/latest.md?code-lang=java) and then save the example to `Example.java` and run following commands:

```bash
DD_SITE="datadoghq.com" DD_BEARER_TOKEN="<PERSONAL_ACCESS_TOKEN OR SERVICE_ACCESS_TOKEN>" java "Example.java"
```
{% /tab %}

{% tab label="Python" %}
```python
"""
Get SPA Recommendations returns "OK" response
"""

from os import environ
from datadog_api_client import ApiClient, Configuration
from datadog_api_client.v2.api.spa_api import SpaApi

configuration = Configuration()
configuration.access_token = environ["DD_BEARER_TOKEN"]
configuration.unstable_operations["get_spa_recommendations"] = True
with ApiClient(configuration) as api_client:
    api_instance = SpaApi(api_client)
    response = api_instance.get_spa_recommendations(
        service="service",
    )

    print(response)
```

#### Instructions

First [install the library and its dependencies](https://dnd37xeb23o8n.cloudfront.net/api/latest.md?code-lang=python) and then save the example to `example.py` and run following commands:

```bash
DD_SITE="datadoghq.com" DD_BEARER_TOKEN="<PERSONAL_ACCESS_TOKEN OR SERVICE_ACCESS_TOKEN>" python3 "example.py"
```
{% /tab %}

{% tab label="Ruby" %}
```ruby
# Get SPA Recommendations returns "OK" response

require "datadog_api_client"
DatadogAPIClient.configure do |config|
  config.access_token = ENV["DD_BEARER_TOKEN"]
  config.unstable_operations["v2.get_spa_recommendations".to_sym] = true
end
api_instance = DatadogAPIClient::V2::SpaAPI.new
p api_instance.get_spa_recommendations("service")
```

#### Instructions

First [install the library and its dependencies](https://dnd37xeb23o8n.cloudfront.net/api/latest.md?code-lang=ruby) and then save the example to `example.rb` and run following commands:

```bash
DD_SITE="datadoghq.com" DD_BEARER_TOKEN="<PERSONAL_ACCESS_TOKEN OR SERVICE_ACCESS_TOKEN>" rb "example.rb"
```
{% /tab %}

{% tab label="Rust" %}
```rust
// Get SPA Recommendations returns "OK" response
use datadog_api_client::datadog;
use datadog_api_client::datadogV2::api_spa::GetSPARecommendationsOptionalParams;
use datadog_api_client::datadogV2::api_spa::SpaAPI;

#[tokio::main]
async fn main() {
    let mut configuration = datadog::Configuration::new();
    configuration.set_unstable_operation_enabled("v2.get_spa_recommendations", true);
    let api = SpaAPI::with_config(configuration);
    let resp = api
        .get_spa_recommendations(
            "service".to_string(),
            GetSPARecommendationsOptionalParams::default(),
        )
        .await;
    if let Ok(value) = resp {
        println!("{:#?}", value);
    } else {
        println!("{:#?}", resp.unwrap_err());
    }
}
```

#### Instructions

First [install the library and its dependencies](https://dnd37xeb23o8n.cloudfront.net/api/latest.md?code-lang=rust) and then save the example to `src/main.rs` and run following commands:

```bash
DD_SITE="datadoghq.com" cargo run
```
{% /tab %}

{% tab label="TypeScript" %}
```typescript
/**
 * Get SPA Recommendations returns "OK" response
 */

import { client, v2 } from "@datadog/datadog-api-client";

const configuration = client.createConfiguration({
  authMethods: {
    AuthZ: {
      accessToken: process.env.DD_BEARER_TOKEN as string,
    },
  },
});
configuration.unstableOperations["v2.getSPARecommendations"] = true;
const apiInstance = new v2.SpaApi(configuration);

const params: v2.SpaApiGetSPARecommendationsRequest = {
  service: "service",
};

apiInstance
  .getSPARecommendations(params)
  .then((data: v2.RecommendationDocument) => {
    console.log(
      "API called successfully. Returned data: " + JSON.stringify(data)
    );
  })
  .catch((error: any) => console.error(error));
```

#### Instructions

First [install the library and its dependencies](https://dnd37xeb23o8n.cloudfront.net/api/latest.md?code-lang=typescript) and then save the example to `example.ts` and run following commands:

```bash
DD_SITE="datadoghq.com" DD_BEARER_TOKEN="<PERSONAL_ACCESS_TOKEN OR SERVICE_ACCESS_TOKEN>" tsc "example.ts"
```
{% /tab %}
{% /tabs %}
