Thanks a lot, Brian. I think I should create an issue. On Monday, May 20, 2024 at 1:37:51 PM UTC+8 Brian Candler wrote:
> > server returned HTTP status 500 Internal Server Error: too old sample > > This is not the server failing to process the data; it's the client > supplying invalid data. You found that this has been fixed to a 400. > > > server returned HTTP status 500 Internal Server Error: label name > \"prometheus\" is not unique: invalid sample > > I can't speak for the authors, but it looks to me like that should be a > 400 as well. > > On Monday 20 May 2024 at 04:52:03 UTC+1 koly li wrote: > >> Sorry for my poor description. Here is the story: >> >> 1) At first, we are using prometheus v2.47 >> >> Then we found all metrics are missing, we check the prometheus log and >> prometheus agent log: >> >> prometheus log(lots of lines): >> ts=2024-04-19T20:33:26.485Z caller=write_handler.go:76 level=error >> component=web msg="Error appending remote write" err="too old sample" >> ts=2024-04-19T20:33:26.539Z caller=write_handler.go:76 level=error >> component=web msg="Error appending remote write" err="too old sample" >> ts=2024-04-19T20:33:26.626Z caller=write_handler.go:76 level=error >> component=web msg="Error appending remote write" err="too old sample" >> ts=2024-04-19T20:33:26.775Z caller=write_handler.go:76 level=error >> component=web msg="Error appending remote write" err="too old sample" >> ts=2024-04-19T20:33:27.042Z caller=write_handler.go:76 level=error >> component=web msg="Error appending remote write" err="too old sample" >> ts=2024-04-19T20:33:27.552Z caller=write_handler.go:76 level=error >> component=web msg="Error appending remote write" err="too old sample" >> .... >> ts=2024-04-22T03:00:03.327Z caller=write_handler.go:76 level=error >> component=web msg="Error appending remote write" err="too old sample" >> ts=2024-04-22T03:00:08.394Z caller=write_handler.go:76 level=error >> component=web msg="Error appending remote write" err="too old sample" >> >> prometheus agent logs: >> ts=2024-04-19T20:33:26.517Z caller=dedupe.go:112 component=remote >> level=warn remote_name=prometheus-k8s-0 url= >> https://prometheus-k8s-0.monitoring:9091/api/v1/write msg="Failed to >> send batch, retrying" err="server returned HTTP status 500 Internal Server >> Error: too old sample" >> ts=2024-04-19T20:34:29.714Z caller=dedupe.go:112 component=remote >> level=warn remote_name=prometheus-k8s-0 url= >> https://prometheus-k8s-0.monitoring:9091/api/v1/write msg="Failed to >> send batch, retrying" err="server returned HTTP status 500 Internal Server >> Error: too old sample" >> ts=2024-04-19T20:35:30.113Z caller=dedupe.go:112 component=remote >> level=warn remote_name=prometheus-k8s-0 url= >> https://prometheus-k8s-0.monitoring:9091/api/v1/write msg="Failed to >> send batch, retrying" err="server returned HTTP status 500 Internal Server >> Error: too old sample" >> ts=2024-04-19T20:36:30.478Z caller=dedupe.go:112 component=remote >> level=warn remote_name=prometheus-k8s-0 url= >> https://prometheus-k8s-0.monitoring:9091/api/v1/write msg="Failed to >> send batch, retrying" err="server returned HTTP status 500 Internal Server >> Error: too old sample" >> .... >> ts=2024-04-22T02:56:57.281Z caller=dedupe.go:112 component=remote >> level=warn remote_name=prometheus-k8s-0 url= >> https://prometheus-k8s-0.monitoring:9091/api/v1/write msg="Failed to >> send batch, retrying" err="server returned HTTP status 500 Internal Server >> Error: too old sample" >> ts=2024-04-22T02:57:57.624Z caller=dedupe.go:112 component=remote >> level=warn remote_name=prometheus-k8s-0 url= >> https://prometheus-k8s-0.monitoring:9091/api/v1/write msg="Failed to >> send batch, retrying" err="server returned HTTP status 500 Internal Server >> Error: too old sample" >> ts=2024-04-22T02:58:57.943Z caller=dedupe.go:112 component=remote >> level=warn remote_name=prometheus-k8s-0 url= >> https://prometheus-k8s-0.monitoring:9091/api/v1/write msg="Failed to >> send batch, retrying" err="server returned HTTP status 500 Internal Server >> Error: too old sample" >> ts=2024-04-22T02:59:58.267Z caller=dedupe.go:112 component=remote >> level=warn remote_name=prometheus-k8s-0 url= >> https://prometheus-k8s-0.monitoring:9091/api/v1/write msg="Failed to >> send batch, retrying" err="server returned HTTP status 500 Internal Server >> Error: too old sample" >> ts=2024-04-22T03:00:58.733Z caller=dedupe.go:112 component=remote >> level=warn remote_name=prometheus-k8s-0 url= >> https://prometheus-k8s-0.monitoring:9091/api/v1/write msg="Failed to >> send batch, retrying" err="server returned HTTP status 500 Internal Server >> Error: too old sample" >> >> Then we check the codes: >> >> https://github.com/prometheus/prometheus/blob/release-2.47/storage/remote/write_handler.go#L77 >> >> The "too old sample" is considered an 500. And the agent keeps retrying >> (exit only when the error is not Recoverable, and 500 is considered >> Recoverable): >> >> https://github.com/prometheus/prometheus/blob/release-2.51/storage/remote/queue_manager.go#L1670 >> >> > You may have come across a bug where a *particular* piece of data being >> sent by the agent was causing a *particular* version of prometheus to fail >> with a 5xx internal error every time. The logs should make it clear if this >> was happening. >> We guess there is one or more samples with too old timestamps which cause >> the problem. One or more samples with "too old timestamp" cause the >> prometheus agent to retry forever (agent receives 500) , which prevents new >> samples to be sent. >> >> Because there is no logging about the incorrect samples, we cannot figure >> out what these samples are. It logs samples only for several errors: >> https://github.com/prometheus/prometheus/blob/release-2.47/storage/remote/write_handler.go#L132 >> >> > The fundamental issue here is, why should restarting the *agent* cause >> the prometheus *server* to stop returning 500 errors? >> We restart the agent 1~2 days after the problem occurs. The new data does >> not contain too old samples. That's why 500 errors disappear. >> >> 2) then we upgrade to v2.51 >> The new version returns 400 for "too old samples": >> >> https://github.com/prometheus/prometheus/blob/release-2.51/storage/remote/write_handler.go#L72 >> >> However, we encountered another 500: >> prometheus agent log: >> ts=2024-05-11T08:42:01.235Z caller=dedupe.go:112 component=remote >> level=warn remote_name=prometheus-k8s-0 url= >> https://prometheus-k8s-0.monitoring:9091/api/v1/write msg="Failed to >> send batch, retrying" err="server returned HTTP status 500 Internal Server >> Error: label name \"prometheus\" is not unique: invalid sample" >> ts=2024-05-11T08:42:02.749Z caller=dedupe.go:112 component=remote >> level=warn remote_name=prometheus-k8s-0 url= >> https://prometheus-k8s-0.monitoring:9091/api/v1/write msg="Failed to >> send batch, retrying" err="server returned HTTP status 500 Internal Server >> Error: label name \"service\" is not unique: invalid sample" >> ts=2024-05-11T08:42:02.798Z caller=dedupe.go:112 component=remote >> level=warn remote_name=prometheus-k8s-0 url= >> https://prometheus-k8s-0.monitoring:9091/api/v1/write msg="Failed to >> send batch, retrying" err="server returned HTTP status 500 Internal Server >> Error: label name \"resourceType\" is not unique: invalid sample" >> ts=2024-05-11T08:42:02.851Z caller=dedupe.go:112 component=remote >> level=warn remote_name=prometheus-k8s-0 url= >> https://prometheus-k8s-0.monitoring:9091/api/v1/write msg="Failed to >> send batch, retrying" err="server returned HTTP status 500 Internal Server >> Error: label name \"namespace\" is not unique: invalid sample" >> >> we modify the code to log samples, then we get the prometheus log: >> ts=2024-05-11T08:42:26.603Z caller=write_handler.go:134 level=error >> component=web msg="unknown error from remote write" err="label name >> \"resourceId\" is not unique: invalid sample" >> series="{__name__=\"ovs_vswitchd_interface_resets_total\", >> clusterName=\"clustertest150\", clusterRegion=\"region0\", >> clusterZone=\"zone1\", container=\"kube-rbac-proxy\", >> endpoint=\"ovs-metrics\", hostname=\"20230428-wangbo-dev16\", >> if_name=\"veth99fa6555\", instance=\"10.253.58.238:9983\", >> job=\"net-monitor-vnet-ovs\", namespace=\"net-monitor\", >> pod=\"net-monitor-vnet-ovs-66bdz\", prometheus=\"monitoring/agent-0\", >> prometheus_replica=\"prometheus-agent-0-0\", >> resourceId=\"port-naqoi5tmkg5lrt0ubw\", resourceId=\"blb-74se39mqa9k3\", >> resourceType=\"Port\", resourceType=\"BLB\", rs_ip=\"10.0.0.3\", >> service=\"net-monitor-vnet-ovs\", service=\"net-monitor-vnet-ovs\", >> subnet_Id=\"snet-ztojflwrnd08xf5idw\", vip=\"11.4.2.64\", >> vpc_Id=\"vpc-6ss1uz29ctpfv0eqbj\", vpcid=\"11.4.2.64\"}" >> timestamp=1715349156000 >> ts=2024-05-11T08:42:26.603Z caller=write_handler.go:76 level=error >> component=web msg="Error appending remote write" err="label name >> \"resourceId\" is not unique: invalid sample" >> ts=2024-05-11T08:42:26.967Z caller=write_handler.go:134 level=error >> component=web msg="unknown error from remote write" err="label name >> \"service\" is not unique: invalid sample" >> series="{__name__=\"rest_client_request_size_bytes_bucket\", >> clusterName=\"clustertest150\", clusterRegion=\"region0\", >> clusterZone=\"zone1\", container=\"kube-scheduler\", endpoint=\"https\", >> host=\"127.0.0.1:6443\", instance=\"10.253.58.236:10259\", >> job=\"scheduler\", le=\"262144\", namespace=\"kube-scheduler\", >> pod=\"kube-scheduler-20230428-wangbo-dev14\", >> prometheus=\"monitoring/agent-0\", >> prometheus_replica=\"prometheus-agent-0-0\", resourceType=\"NETWORK-HOST\", >> service=\"scheduler\", service=\"net-monitor-vnet-ovs\", verb=\"POST\"}" >> timestamp=1715349164522 >> ts=2024-05-11T08:42:26.967Z caller=write_handler.go:76 level=error >> component=web msg="Error appending remote write" err="label name >> \"service\" is not unique: invalid sample" >> ts=2024-05-11T08:42:27.091Z caller=write_handler.go:134 level=error >> component=web msg="unknown error from remote write" err="label name >> \"prometheus_replica\" is not unique: invalid sample" >> series="{__name__=\"workqueue_work_duration_seconds_sum\", >> clusterName=\"clustertest150\", clusterRegion=\"region0\", >> clusterZone=\"zone1\", endpoint=\"https\", instance=\"21.100.10.52:8443\", >> job=\"metrics\", name=\"ResourceSyncController\", >> namespace=\"service-ca-operator\", >> pod=\"service-ca-operator-645cfdbfb6-rjr4z\", >> prometheus=\"monitoring/agent-0\", >> prometheus_replica=\"prometheus-agent-0-0\", >> prometheus_replica=\"prometheus-agent-0-0\", service=\"metrics\"}" >> timestamp=1715349271085 >> ts=2024-05-11T08:42:27.091Z caller=write_handler.go:76 level=error >> component=web msg="Error appending remote write" err="label name >> \"prometheus_replica\" is not unique: invalid sample" >> >> Currently we dont' know why there are duplicated labels. But when the >> server encounters duplicated labels, it returns 500. Then the agent keeps >> retrying, which means new samples cannot be handled. >> >> we set external_labels in prometheus-agent configs: >> global: >> evaluation_interval: 30s >> scrape_interval: 5m >> scrape_timeout: 1m >> external_labels: >> clusterName: clustertest150 >> clusterRegion: region0 >> clusterZone: zone1 >> prometheus: ccos-monitoring/agent-0 >> prometheus_replica: prometheus-agent-0-0 >> keep_dropped_targets: 1 >> >> and the remote write config: >> remote_write: >> - url: https://prometheus-k8s-0.monitoring:9091/api/v1/write >> remote_timeout: 30s >> name: prometheus-k8s-0 >> write_relabel_configs: >> - target_label: __tmp_cluster_id__ >> replacement: 713c30cb-81c3-411d-b4dc-0c775a0f9564 >> action: replace >> - regex: __tmp_cluster_id__ >> action: labeldrop >> bearer_token: XDFSDF... >> tls_config: >> insecure_skip_verify: true >> queue_config: >> capacity: 10000 >> min_shards: 1 >> max_shards: 500 >> max_samples_per_send: 2000 >> batch_send_deadline: 10s >> min_backoff: 30ms >> max_backoff: 5s >> sample_age_limit: 5m >> >> > You are saying that you would prefer the agent to throw away data, >> rather than hold onto the data and try again later when it may succeed. In >> this situation, retrying is normally the correct thing to do. >> Yes, retry is the normal solution. But there should be maximum number of >> retries. We notice that prometheus agent sets the retry nubmers to the >> request header, but it seems the request header is not used by the server. >> >> prometheus-agent sets the retry numbers to request header: >> >> https://github.com/prometheus/prometheus/blob/release-2.51/storage/remote/client.go#L214 >> >> Besides, if some samples is incorrect and others are correct in the same >> request, why don't prometheus server save the correct part and drop the >> wrong part? It is more complicated as retry should be considered, but is it >> possible to save partial data and return 206 when the maximum number of >> retries is reached? >> >> And should prometheus server log samples for all kinds of error? >> >> https://github.com/prometheus/prometheus/blob/release-2.51/storage/remote/write_handler.go#L133 >> >> On Friday, May 17, 2024 at 8:15:04 PM UTC+8 Brian Candler wrote: >> >>> It's difficult to make sense of what you're saying. Without seeing logs >>> from both the agent and the server while this problem was occurring (e.g. >>> `journalctl -eu prometheus`), it's hard to know what was really happening. >>> Also you need to say what exact versions of prometheus and the agent were >>> running. >>> >>> The fundamental issue here is, why should restarting the *agent* cause >>> the prometheus *server* to stop returning 500 errors? >>> >>> >>> > So my question is why 5xx from the promtheus server is considered >>> Recoverable? >>> >>> It is by definition of the HTTP protocol: >>> https://datatracker.ietf.org/doc/html/rfc2616#section-10.5 >>> >>> Actually it depends on exactly which 5xx error code you're talking >>> about, but common 500 and 503 errors are generally transient, meaning there >>> was a problem at the server and the request may succeed if tried again >>> later. If the prometheus server wanted to tell the client that the request >>> was invalid and could never possibly succeed, then it would return a 4xx >>> error. >>> >>> > And I believe there should be a way to exit the loop, for example a >>> maximum times to retry. >>> >>> You are saying that you would prefer the agent to throw away data, >>> rather than hold onto the data and try again later when it may succeed. In >>> this situation, retrying is normally the correct thing to do. >>> >>> You may have come across a bug where a *particular* piece of data being >>> sent by the agent was causing a *particular* version of prometheus to fail >>> with a 5xx internal error every time. The logs should make it clear if this >>> was happening. >>> >>> On Friday 17 May 2024 at 10:02:49 UTC+1 koly li wrote: >>> >>>> Hello all, >>>> >>>> Recently we found that our samples are all lost. After some >>>> investigation, we found: >>>> 1, we are using prometheus agent to send all data to prometheus server >>>> by remote write >>>> 2, the agent sample sending code is in storage\remote\queue_manager.go, >>>> the function is sendWriteRequestWithBackoff() >>>> 3, inside the function, if attempt(the function where request is made >>>> to prometheus server) function returns an Recoverable Error, then it will >>>> retry sending the request >>>> 4, when a Recoverable error is returned? one scenario is the prometheus >>>> server returned 5xx error >>>> 5, I think not every 5xx error is recoverable, and there is no other >>>> way to exit the for loop in sendWriteRequestWithBackoff(). The agent keeps >>>> retrying but every time it receives an 5xx from the server. so we lost all >>>> samples for hours until we restart the agent >>>> >>>> So my question is why 5xx from the promtheus server is considered >>>> Recoverable? And I believe there should be a way to exit the loop, for >>>> example a maximum times to retry. >>>> >>>> It seems that the agent mode is not mature enough to work in production. >>>> >>> -- You received this message because you are subscribed to the Google Groups "Prometheus Users" group. To unsubscribe from this group and stop receiving emails from it, send an email to prometheus-users+unsubscr...@googlegroups.com. To view this discussion on the web visit https://groups.google.com/d/msgid/prometheus-users/5661de1d-21c5-486c-9177-fa346ebdc922n%40googlegroups.com.