{"record":{"id":"e66a4ae167ced208","repo":"apache/druid","slug":"openlineage-event-dropped-all-d-attempts-to-po-e66a4a","errorCode":null,"errorMessage":"OpenLineage event dropped: all [%d] attempts to POST to [%s] returned non-2xx status [%d]","messagePattern":"OpenLineage event dropped: all \\[(.+?)\\] attempts to POST to \\[(.+?)\\] returned non-2xx status \\[(.+?)\\]","errorType":"console","errorClass":null,"httpStatus":null,"severity":"error","filePath":"extensions-contrib/openlineage-emitter/src/main/java/org/apache/druid/extensions/openlineage/OpenLineageRequestLogger.java","lineNumber":526,"sourceCode":"            MAX_SEND_RETRIES + 1,\n            transportUrl\n        );\n      }\n      finally {\n        post.releaseConnection();\n      }\n    }\n\n    // All attempts exhausted — delivery guarantee is at-most-once.\n    if (lastException != null) {\n      log.warn(\n          lastException,\n          \"OpenLineage event dropped: all [%d] attempts to POST to [%s] failed with an exception\",\n          MAX_SEND_RETRIES + 1,\n          transportUrl\n      );\n    } else {\n      log.warn(\n          \"OpenLineage event dropped: all [%d] attempts to POST to [%s] returned non-2xx status [%d]\",\n          MAX_SEND_RETRIES + 1,\n          transportUrl,\n          lastStatusCode\n      );\n    }\n  }\n\n  private void putLongStat(ObjectNode node, String targetKey, Map<String, Object> stats, String... sourceKeys)\n  {\n    for (String key : sourceKeys) {\n      Object val = stats.get(key);\n      if (val instanceof Number) {\n        node.put(targetKey, ((Number) val).longValue());\n        return;\n      }\n    }\n  }","sourceCodeStart":508,"sourceCodeEnd":544,"githubUrl":"https://github.com/apache/druid/blob/9b90983fd291f26935af934383ce360473179e4d/extensions-contrib/openlineage-emitter/src/main/java/org/apache/druid/extensions/openlineage/OpenLineageRequestLogger.java#L508-L544","documentation":"Like the exception variant, but here every retry of the OpenLineage POST completed and received a non-2xx HTTP status. The event is dropped (at-most-once) and the final status code is reported in the warning.","triggerScenarios":"The OpenLineage endpoint consistently responds with 4xx/5xx — e.g. 404 for a wrong path, 401/403 for auth-protected collectors, 413 for oversized payloads, 429 rate limiting, or 5xx server errors on every attempt.","commonSituations":"Wrong URL path (missing /api/v1/lineage); API key/token required but not configured; event payload too large for the collector; collector rate limiting bursts of lineage events.","solutions":["Read lastStatusCode in the warning: 404 → fix URL path; 401/403 → configure auth; 429 → slow down or raise limits; 5xx → check collector health","Verify the transportUrl points at the lineage ingest endpoint (e.g. http://host:5000/api/v1/lineage)","If 413, reduce event/SQL facet size (see SQL facet truncation) or raise collector body limit","Test the exact payload against the endpoint with curl to reproduce the status code"],"exampleFix":"// before\ntransportUrl = \"http://marquez:5000\" // returns 404\n// after\ntransportUrl = \"http://marquez:5000/api/v1/lineage\"","handlingStrategy":"retry","validationCode":"int code = curlStatus(transportUrl); // expect 2xx before enabling emission\nif (code < 200 || code >= 300) { log.warn(\"OpenLineage endpoint returned %d\", code); }","typeGuard":null,"tryCatchPattern":"try { logger.emit(event); } catch (Exception e) { /* check logged lastStatusCode; 4xx means fix config, 5xx retry later */ }","preventionTips":["Use the full lineage ingest path (/api/v1/lineage)","Configure auth if the collector requires it","Back off on 429; reduce payload on 413"],"tags":["openlineage","http-status","retry-exhausted"],"backgroundTag":"http-non-2xx-response","analyzedSha":"9b90983fd291f26935af934383ce360473179e4d","analyzedAt":"2026-09-07T13:32:30.957Z","contentChangedAt":"2026-09-07T13:32:30.957Z","schemaVersion":2},"datasetVersion":"2026-09-14T11:17:12.474Z"}