github.com/outbrain/consul@v1.4.5/website/source/api/agent/service.html.md (about)

     1  ---
     2  layout: api
     3  page_title: Service - Agent - HTTP API
     4  sidebar_current: api-agent-service
     5  description: |-
     6    The /agent/service endpoints interact with services on the local agent in
     7    Consul.
     8  ---
     9  
    10  # Service - Agent HTTP API
    11  
    12  The `/agent/service` endpoints interact with services on the local agent in
    13  Consul. These should not be confused with services in the catalog.
    14  
    15  ## List Services
    16  
    17  This endpoint returns all the services that are registered with
    18  the local agent. These services were either provided through configuration files
    19  or added dynamically using the HTTP API.
    20  
    21  It is important to note that the services known by the agent may be different
    22  from those reported by the catalog. This is usually due to changes being made
    23  while there is no leader elected. The agent performs active
    24  [anti-entropy](/docs/internals/anti-entropy.html), so in most situations
    25  everything will be in sync within a few seconds.
    26  
    27  | Method | Path                         | Produces                   |
    28  | ------ | ---------------------------- | -------------------------- |
    29  | `GET`  | `/agent/services`            | `application/json`         |
    30  
    31  The table below shows this endpoint's support for
    32  [blocking queries](/api/index.html#blocking-queries),
    33  [consistency modes](/api/index.html#consistency-modes),
    34  [agent caching](/api/index.html#agent-caching), and
    35  [required ACLs](/api/index.html#acls).
    36  
    37  | Blocking Queries | Consistency Modes | Agent Caching | ACL Required   |
    38  | ---------------- | ----------------- | ------------- | -------------- |
    39  | `NO`             | `none`            | `none`        | `service:read` |
    40  
    41  ### Sample Request
    42  
    43  ```text
    44  $ curl \
    45      http://127.0.0.1:8500/v1/agent/services
    46  ```
    47  
    48  ### Sample Response
    49  
    50  ```json
    51  {
    52    "redis": {
    53        "ID": "redis",
    54        "Service": "redis",
    55        "Tags": [],
    56        "Meta": {
    57            "redis_version": "4.0"
    58        },
    59        "Port": 8000,
    60        "Address": "",
    61        "EnableTagOverride": false,
    62        "Weights": {
    63            "Passing": 10,
    64            "Warning": 1
    65        }
    66    }
    67  }
    68  ```
    69  
    70  ## Get Service Configuration
    71  
    72  This endpoint was added in Consul 1.3.0 and returns the full service definition
    73  for a single service instance registered on the local agent. It is used by
    74  [Connect proxies](/docs/connect/proxies.html) to discover the embedded proxy
    75  configuration that was registered with the instance.
    76  
    77  It is important to note that the services known by the agent may be different
    78  from those reported by the catalog. This is usually due to changes being made
    79  while there is no leader elected. The agent performs active
    80  [anti-entropy](/docs/internals/anti-entropy.html), so in most situations
    81  everything will be in sync within a few seconds.
    82  
    83  | Method | Path                         | Produces                   |
    84  | ------ | ---------------------------- | -------------------------- |
    85  | `GET`  | `/agent/service/:service_id` | `application/json`         |
    86  
    87  The table below shows this endpoint's support for
    88  [blocking queries](/api/index.html#blocking-queries),
    89  [consistency modes](/api/index.html#consistency-modes),
    90  [agent caching](/api/index.html#agent-caching), and
    91  [required ACLs](/api/index.html#acls).
    92  
    93  | Blocking Queries | Consistency Modes | Agent Caching | ACL Required   |
    94  | ---------------- | ----------------- | ------------- | -------------- |
    95  | `YES`<sup>1</sup>| `none`            | `none`        | `service:read` |
    96  
    97  <sup>1</sup> Supports [hash-based
    98  blocking](/api/index.html#hash-based-blocking-queries) only.
    99  
   100  ### Parameters
   101  
   102  - `service_id` `(string: <required>)` - Specifies the ID of the service to
   103    fetch. This is specified as part of the URL.
   104  
   105  ### Sample Request
   106  
   107  ```text
   108  $ curl \
   109      http://127.0.0.1:8500/v1/agent/service/web-sidecar-proxy
   110  ```
   111  
   112  ### Sample Response
   113  
   114  ```json
   115  {
   116      "Kind": "connect-proxy",
   117      "ID": "web-sidecar-proxy",
   118      "Service": "web-sidecar-proxy",
   119      "Tags": null,
   120      "Meta": null,
   121      "Port": 18080,
   122      "Address": "",
   123      "Weights": {
   124          "Passing": 1,
   125          "Warning": 1
   126      },
   127      "EnableTagOverride": false,
   128      "ContentHash": "4ecd29c7bc647ca8",
   129      "Proxy": {
   130          "DestinationServiceName": "web",
   131          "DestinationServiceID": "web",
   132          "LocalServiceAddress": "127.0.0.1",
   133          "LocalServicePort": 8080,
   134          "Config": {
   135              "foo": "bar"
   136          },
   137          "Upstreams": [
   138              {
   139                  "DestinationType": "service",
   140                  "DestinationName": "db",
   141                  "LocalBindPort": 9191
   142              }
   143          ]
   144      }
   145  }
   146  ```
   147  
   148  The response has the same structure as the [service
   149  definition](/docs/agent/services.html) with one extra field `ContentHash` which
   150  contains the [hash-based blocking
   151  query](/api/index.html#hash-based-blocking-queries) hash for the result. The
   152  same hash is also present in `X-Consul-ContentHash`.
   153  
   154  ## Get local service health
   155  
   156  Retrieve an aggregated state of service(s) on the local agent by name.
   157  
   158  This endpoints support JSON format and text/plain formats, JSON being the
   159  default. In order to get the text format, you can append `?format=text` to
   160  the URL or use Mime Content negotiation by specifying a HTTP Header
   161  `Accept` starting with `text/plain`.
   162  
   163  | Method | Path                                                      | Produces           |
   164  | ------ | --------------------------------------------------------- | ------------------ |
   165  | `GET`  | `/v1/agent/health/service/name/:service_name`             | `application/json` |
   166  | `GET`  | `/v1/agent/health/service/name/:service_name?format=text` | `text/plain`       |
   167  
   168  The table below shows this endpoint's support for
   169  [blocking queries](/api/index.html#blocking-queries),
   170  [consistency modes](/api/index.html#consistency-modes),
   171  [agent caching](/api/index.html#agent-caching), and
   172  [required ACLs](/api/index.html#acls).
   173  
   174  | Blocking Queries | Consistency Modes | Agent Caching | ACL Required   |
   175  | ---------------- | ----------------- | ------------- | -------------- |
   176  | `NO`             | `none`            | `none`        | `service:read` |
   177  
   178  Those endpoints return the aggregated values of all healthchecks for the
   179  service instance(s) and will return the corresponding HTTP codes:
   180  
   181  | Result | Meaning                                                         |
   182  | ------ | ----------------------------------------------------------------|
   183  | `200`  | All healthchecks of every matching service instance are passing |
   184  | `400`  | Bad parameter (missing service name of id)                      |
   185  | `404`  | No such service id or name                                      |
   186  | `429`  | Some healthchecks are passing, at least one is warning          |
   187  | `503`  | At least one of the healthchecks is critical                    |
   188  
   189  Those endpoints might be usefull for the following use-cases:
   190  
   191  * a load-balancer wants to check IP connectivity with an agent and retrieve
   192    the aggregated status of given service
   193  * create aliases for a given service (thus, the healthcheck of alias uses
   194    http://localhost:8500/v1/agent/service/id/aliased_service_id healthcheck)
   195  
   196  
   197  ##### Note
   198  If you know the ID of service you want to target, it is recommended to use
   199  [`/v1/agent/health/service/id/:service_id`](/api/agent/service.html#get-local-service-health-by-id)
   200  so you have the result for the service only. When requesting
   201  `/v1/agent/health/service/name/:service_name`, the caller will receive the
   202  worst state of all services having the given name.
   203  
   204  ### Sample Requests
   205  
   206  Given 2 services with name `web`, with web2 critical and web1 passing:
   207  
   208  #### List worst statuses of all instances of web-demo services (HTTP 503)
   209  
   210  ##### By Name, Text
   211  
   212  ```shell
   213  curl http://localhost:8500/v1/agent/health/service/name/web?format=text
   214  critical
   215  ```
   216  
   217  ##### By Name, JSON
   218  
   219  In JSON, the detail of passing/warning/critical services is present in output,
   220  in a array.
   221  
   222  ```shell
   223  curl localhost:8500/v1/agent/health/service/name/web
   224  ```
   225  
   226  ```json
   227  {
   228      "critical": [
   229          {
   230              "ID": "web2",
   231              "Service": "web",
   232              "Tags": [
   233                  "rails"
   234              ],
   235              "Address": "",
   236              "Meta": null,
   237              "Port": 80,
   238              "EnableTagOverride": false,
   239              "ProxyDestination": "",
   240              "Connect": {
   241                  "Native": false,
   242                  "Proxy": null
   243              },
   244              "CreateIndex": 0,
   245              "ModifyIndex": 0
   246          }
   247      ],
   248      "passing": [
   249          {
   250              "ID": "web1",
   251              "Service": "web",
   252              "Tags": [
   253                  "rails"
   254              ],
   255              "Address": "",
   256              "Meta": null,
   257              "Port": 80,
   258              "EnableTagOverride": false,
   259              "ProxyDestination": "",
   260              "Connect": {
   261                  "Native": false,
   262                  "Proxy": null
   263              },
   264              "CreateIndex": 0,
   265              "ModifyIndex": 0
   266          }
   267      ]
   268  }
   269  ```
   270  
   271  #### List status of web2 (HTTP 503)
   272  
   273  ##### Failure By ID, Text
   274  
   275  ```shell
   276  curl http://localhost:8500/v1/agent/health/service/id/web2?format=text
   277  critical
   278  ```
   279  
   280  ##### Failure By ID, JSON
   281  
   282  In JSON, the output per ID is not an array, but only contains the value
   283  of service.
   284  
   285  ```shell
   286  curl localhost:8500/v1/agent/health/service/id/web2
   287  ```
   288  
   289  ```json
   290  {
   291      "critical": {
   292          "ID": "web2",
   293          "Service": "web",
   294          "Tags": [
   295              "rails"
   296          ],
   297          "Address": "",
   298          "Meta": null,
   299          "Port": 80,
   300          "EnableTagOverride": false,
   301          "ProxyDestination": "",
   302          "Connect": {
   303              "Native": false,
   304              "Proxy": null
   305          },
   306          "CreateIndex": 0,
   307          "ModifyIndex": 0
   308      }
   309  }
   310  ```
   311  
   312  #### List status of web2 (HTTP 200)
   313  
   314  ##### Success By ID, Text
   315  
   316  ```shell
   317  curl localhost:8500/v1/agent/health/service/id/web1?format=text
   318  passing
   319  ```
   320  
   321  #### Success By ID, JSON
   322  
   323  ```shell
   324  curl localhost:8500/v1/agent/health/service/id/web1
   325  ```
   326  
   327  ```json
   328  {
   329      "passing": {
   330          "ID": "web1",
   331          "Service": "web",
   332          "Tags": [
   333              "rails"
   334          ],
   335          "Address": "",
   336          "Meta": null,
   337          "Port": 80,
   338          "EnableTagOverride": false,
   339          "ProxyDestination": "",
   340          "Connect": {
   341              "Native": false,
   342              "Proxy": null
   343          },
   344          "CreateIndex": 0,
   345          "ModifyIndex": 0
   346      }
   347  }
   348  ```
   349  
   350  ## Get local service health by its ID
   351  
   352  Retrive an aggregated state of service(s) on the local agent by ID.
   353  
   354  See:
   355  
   356  | Method | Path                                                   | Produces           |
   357  | ------ | ------------------------------------------------------ | ------------------ |
   358  | `GET`  | `/v1/agent/health/service/id/:service_id`             | `application/json` |
   359  | `GET`  | `/v1/agent/health/service/id/:service_id?format=text` | `text/plain`       |
   360  
   361  Parameters and response format are the same as
   362  [`/v1/agent/health/service/name/:service_name`](/api/agent/service.html#get-local-service-health).
   363  
   364  ## Register Service
   365  
   366  This endpoint adds a new service, with an optional health check, to the local
   367  agent.
   368  
   369  The agent is responsible for managing the status of its local services, and for
   370  sending updates about its local services to the servers to keep the global
   371  catalog in sync.
   372  
   373  For "connect-proxy" kind services, the `service:write` ACL for the
   374  `Proxy.DestinationServiceName` value is also required to register the service.
   375  
   376  | Method | Path                         | Produces                   |
   377  | ------ | ---------------------------- | -------------------------- |
   378  | `PUT`  | `/agent/service/register`    | `application/json`         |
   379  
   380  The table below shows this endpoint's support for
   381  [blocking queries](/api/index.html#blocking-queries),
   382  [consistency modes](/api/index.html#consistency-modes),
   383  [agent caching](/api/index.html#agent-caching), and
   384  [required ACLs](/api/index.html#acls).
   385  
   386  | Blocking Queries | Consistency Modes | Agent Caching | ACL Required    |
   387  | ---------------- | ----------------- | ------------- | --------------- |
   388  | `NO`             | `none`            | `none`        | `service:write` |
   389  
   390  ### Parameters
   391  
   392  Note that this endpoint, unlike most also [supports `snake_case`](/docs/agent/services.html#service-definition-parameter-case)
   393  service definition keys for compatibility with the config file format.
   394  
   395  - `Name` `(string: <required>)` - Specifies the logical name of the service.
   396    Many service instances may share the same logical service name.
   397  
   398  - `ID` `(string: "")` - Specifies a unique ID for this service. This must be
   399    unique per _agent_. This defaults to the `Name` parameter if not provided.
   400  
   401  - `Tags` `(array<string>: nil)` - Specifies a list of tags to assign to the
   402    service. These tags can be used for later filtering and are exposed via the
   403    APIs.
   404  
   405  - `Address` `(string: "")` - Specifies the address of the service. If not
   406    provided, the agent's address is used as the address for the service during
   407    DNS queries.
   408  
   409  - `Meta` `(map<string|string>: nil)` - Specifies arbitrary KV metadata
   410    linked to the service instance.
   411  
   412  - `Port` `(int: 0)` - Specifies the port of the service.
   413  
   414  - `Kind` `(string: "")` - The kind of service. Defaults to "" which is a
   415    typical Consul service. This value may also be "connect-proxy" for
   416    services that are [Connect-capable](/docs/connect/index.html)
   417    proxies representing another service.
   418  
   419  - `ProxyDestination` `(string: "")` - **Deprecated** From 1.2.0 to 1.2.3 this
   420    was used for "connect-proxy" `Kind` services however the equivalent field is
   421    now in `Proxy.DestinationServiceName`. Registrations using this field will
   422    continue to work until some later major version where this will be removed
   423    entirely. It's strongly recommended to switch to using the new field.
   424  
   425  - `Proxy` `(Proxy: nil)` - From 1.2.3 on, specifies the configuration for a
   426    Connect proxy instance. This is only valid if `Kind == "connect-proxy"`. See
   427    the [Proxy documentation](/docs/connect/proxies.html) for full details.
   428  
   429  - `Connect` `(Connect: nil)` - Specifies the
   430    [configuration for Connect](/docs/connect/configuration.html). See the
   431    [Connect Structure](#connect-structure) section below for supported fields.
   432  
   433  - `Check` `(Check: nil)` - Specifies a check. Please see the
   434    [check documentation](/api/agent/check.html) for more information about the
   435    accepted fields. If you don't provide a name or id for the check then they
   436    will be generated. To provide a custom id and/or name set the `CheckID`
   437    and/or `Name` field.
   438  
   439  - `Checks` `(array<Check>: nil)` - Specifies a list of checks. Please see the
   440    [check documentation](/api/agent/check.html) for more information about the
   441    accepted fields. If you don't provide a name or id for the check then they
   442    will be generated. To provide a custom id and/or name set the `CheckID`
   443    and/or `Name` field. The automatically generated `Name` and `CheckID` depend
   444    on the position of the check within the array, so even though the behavior is
   445    deterministic, it is recommended for all checks to either let consul set the
   446    `CheckID` by leaving the field empty/omitting it or to provide a unique value.
   447  
   448  - `EnableTagOverride` `(bool: false)` - Specifies to disable the anti-entropy
   449    feature for this service's tags. If `EnableTagOverride` is set to `true` then
   450    external agents can update this service in the [catalog](/api/catalog.html)
   451    and modify the tags. Subsequent local sync operations by this agent will
   452    ignore the updated tags. For instance, if an external agent modified both the
   453    tags and the port for this service and `EnableTagOverride` was set to `true`
   454    then after the next sync cycle the service's port would revert to the original
   455    value but the tags would maintain the updated value. As a counter example, if
   456    an external agent modified both the tags and port for this service and
   457    `EnableTagOverride` was set to `false` then after the next sync cycle the
   458    service's port _and_ the tags would revert to the original value and all
   459    modifications would be lost.
   460  
   461  - `Weights` `(Weights: nil)` - Specifies weights for the service. Please see the
   462    [service documentation](/docs/agent/services.html) for more information about
   463    weights. If this field is not provided weights will default to
   464    `{"Passing": 1, "Warning": 1}`.
   465  
   466      It is important to note that this applies only to the locally registered
   467      service. If you have multiple nodes all registering the same service their
   468      `EnableTagOverride` configuration and all other service configuration items
   469      are independent of one another. Updating the tags for the service registered
   470      on one node is independent of the same service (by name) registered on
   471      another node. If `EnableTagOverride` is not specified the default value is
   472      `false`. See [anti-entropy syncs](/docs/internals/anti-entropy.html) for
   473      more info.
   474  
   475  #### Connect Structure
   476  
   477  For the `Connect` field, the parameters are:
   478  
   479  - `Native` `(bool: false)` - Specifies whether this service supports
   480    the [Connect](/docs/connect/index.html) protocol [natively](/docs/connect/native.html).
   481    If this is true, then Connect proxies, DNS queries, etc. will be able to
   482    service discover this service.
   483  - `Proxy` `(Proxy: nil)` -
   484    [**Deprecated**](/docs/connect/proxies/managed-deprecated.html) Specifies that
   485    a managed Connect proxy should be started for this service instance, and
   486    optionally provides configuration for the proxy. The format is as documented
   487    in [Managed Proxy Deprecation](/docs/connect/proxies/managed-deprecated.html).
   488  - `SidecarService` `(ServiceDefinition: nil)` - Specifies an optional nested
   489    service definition to register. For more information see
   490    [Sidecar Service Registration](/docs/connect/proxies/sidecar-service.html).
   491  
   492  ### Sample Payload
   493  
   494  ```json
   495  {
   496    "ID": "redis1",
   497    "Name": "redis",
   498    "Tags": [
   499      "primary",
   500      "v1"
   501    ],
   502    "Address": "127.0.0.1",
   503    "Port": 8000,
   504    "Meta": {
   505      "redis_version": "4.0"
   506    },
   507    "EnableTagOverride": false,
   508    "Check": {
   509      "DeregisterCriticalServiceAfter": "90m",
   510      "Args": ["/usr/local/bin/check_redis.py"],
   511      "HTTP": "http://localhost:5000/health",
   512      "Interval": "10s",
   513      "TTL": "15s"
   514    },
   515    "Weights": {
   516      "Passing": 10,
   517      "Warning": 1
   518    }
   519  }
   520  ```
   521  
   522  ### Sample Request
   523  
   524  ```text
   525  $ curl \
   526      --request PUT \
   527      --data @payload.json \
   528      http://127.0.0.1:8500/v1/agent/service/register
   529  ```
   530  
   531  ## Deregister Service
   532  
   533  This endpoint removes a service from the local agent. If the service does not
   534  exist, no action is taken.
   535  
   536  The agent will take care of deregistering the service with the catalog. If there
   537  is an associated check, that is also deregistered.
   538  
   539  | Method | Path                         | Produces                   |
   540  | ------ | ---------------------------- | -------------------------- |
   541  | `PUT`  | `/agent/service/deregister/:service_id` | `application/json` |
   542  
   543  The table below shows this endpoint's support for
   544  [blocking queries](/api/index.html#blocking-queries),
   545  [consistency modes](/api/index.html#consistency-modes),
   546  [agent caching](/api/index.html#agent-caching), and
   547  [required ACLs](/api/index.html#acls).
   548  
   549  | Blocking Queries | Consistency Modes | Agent Caching | ACL Required    |
   550  | ---------------- | ----------------- | ------------- | --------------- |
   551  | `NO`             | `none`            | `none`        | `service:write` |
   552  
   553  ### Parameters
   554  
   555  - `service_id` `(string: <required>)` - Specifies the ID of the service to
   556    deregister. This is specified as part of the URL.
   557  
   558  ### Sample Request
   559  
   560  ```text
   561  $ curl \
   562      --request PUT \
   563      http://127.0.0.1:8500/v1/agent/service/deregister/my-service-id
   564  ```
   565  
   566  ## Enable Maintenance Mode
   567  
   568  This endpoint places a given service into "maintenance mode". During maintenance
   569  mode, the service will be marked as unavailable and will not be present in DNS
   570  or API queries. This API call is idempotent. Maintenance mode is persistent and
   571  will be automatically restored on agent restart.
   572  
   573  | Method | Path                         | Produces                   |
   574  | ------ | ---------------------------- | -------------------------- |
   575  | `PUT`  | `/agent/service/maintenance/:service_id` | `application/json`         |
   576  
   577  The table below shows this endpoint's support for
   578  [blocking queries](/api/index.html#blocking-queries),
   579  [consistency modes](/api/index.html#consistency-modes),
   580  [agent caching](/api/index.html#agent-caching), and
   581  [required ACLs](/api/index.html#acls).
   582  
   583  | Blocking Queries | Consistency Modes | Agent Caching | ACL Required    |
   584  | ---------------- | ----------------- | ------------- | --------------- |
   585  | `NO`             | `none`            | `none`        | `service:write` |
   586  
   587  ### Parameters
   588  
   589  - `service_id` `(string: <required>)` - Specifies the ID of the service to put
   590    in maintenance mode. This is specified as part of the URL.
   591  
   592  - `enable` `(bool: <required>)` - Specifies whether to enable or disable
   593    maintenance mode. This is specified as part of the URL as a query string
   594    parameter.
   595  
   596  - `reason` `(string: "")` - Specifies a text string explaining the reason for
   597    placing the node into maintenance mode. This is simply to aid human operators.
   598    If no reason is provided, a default value will be used instead. This is
   599    specified as part of the URL as a query string parameter, and, as such, must
   600    be URI-encoded.
   601  
   602  ### Sample Request
   603  
   604  ```text
   605  $ curl \
   606      --request PUT \
   607      http://127.0.0.1:8500/v1/agent/service/maintenance/my-service-id?enable=true&reason=For+the+docs
   608  ```