-
Notifications
You must be signed in to change notification settings - Fork 3.7k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Add ingest/processed/bytes metric #17581
base: master
Are you sure you want to change the base?
Add ingest/processed/bytes metric #17581
Conversation
@@ -329,6 +331,27 @@ public void run(final QueryListener queryListener) throws Exception | |||
} | |||
// Call onQueryComplete after Closer is fully closed, ensuring no controller-related processing is ongoing. | |||
queryListener.onQueryComplete(reportPayload); | |||
|
|||
long totalProcessedBytes = reportPayload.getCounters().copyMap().values().stream() |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This seems like a wrong place to put this logic .
Ingest/processed/bytes seems like a ingestion only metric no ?
If that is the case, we should emit the metric only if the query is an ingestion query.
you could probably expose a method here https://github.com/apache/druid/blob/9bebe7f1e5ab0f40efbff620769d0413c943683c/extensions-core/multi-stage-query/src/main/java/org/apache/druid/msq/exec/ControllerImpl.java#L517
saying emit summary metrics and have the task report and the query passed to it.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Moved the logic
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I think the place where it has moved is correct.
Rather than ingest in the metric name can we rename the matric to input/processed/bytes
or something since we would want that metric in msq selects as well.
Also the msq code might need to be adjusted so that only leaf nodes contribute to this metric no ? as an equivalent batch ingest with range partitioning will show less processed bytes
since the shuffle stage input is not being counted for. A simple test should be sufficient to rule this out.
Try a query like replace bar all using select * from extern(http) partitioned by day clustered by col1
and an equivalent range partitioning spec for batch ingestion for the same http input source.
cc @kfaraz
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@cryptoe This metric will be used in the billing console and should be named ingest/processed/bytes
.
Regarding the msq code to being on the leaf nodes, where would that be? Regarding the test, any pointers to existing tests would be helpful, this is my first time in this area of code.
Also there are some static check failures which need to be looked at. |
@cryptoe fixed |
...n/java/org/apache/druid/indexing/common/task/batch/parallel/ParallelIndexSupervisorTask.java
Outdated
Show resolved
Hide resolved
...ce/src/main/java/org/apache/druid/indexing/seekablestream/SeekableStreamIndexTaskRunner.java
Outdated
Show resolved
Hide resolved
...ce/src/main/java/org/apache/druid/indexing/seekablestream/SeekableStreamIndexTaskRunner.java
Outdated
Show resolved
Hide resolved
extensions-core/multi-stage-query/src/main/java/org/apache/druid/msq/exec/ControllerImpl.java
Outdated
Show resolved
Hide resolved
long bytesProcessed = 0; | ||
for (ByteEntity entity : record.getData()) { | ||
bytesProcessed += entity.getBuffer().remaining(); | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Can we just reuse the rowIngestionMeters.getProcessedBytes()
instead of computing the value explicitly here?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Updated
long totalProcessedBytes = msqTaskReportPayload.getCounters() != null | ||
? msqTaskReportPayload.getCounters().copyMap().values().stream().mapToLong( | ||
integerCounterSnapshotsMap -> integerCounterSnapshotsMap.values().stream() | ||
.mapToLong(counterSnapshots -> { | ||
Map<String, QueryCounterSnapshot> workerCounters = counterSnapshots.getMap(); | ||
return workerCounters.entrySet().stream().mapToLong( | ||
channel -> { | ||
if (channel.getKey().startsWith("input")) { | ||
ChannelCounters.Snapshot snapshot = (ChannelCounters.Snapshot) channel.getValue(); | ||
return snapshot.getBytes() == null ? 0L : Arrays.stream(snapshot.getBytes()).sum(); | ||
} | ||
return 0L; | ||
}).sum(); | ||
}).sum()).sum() | ||
: 0; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This seems a little difficult to read.
Can we clean up this logic a little? Maybe by returning early when msqTaskReportPayload.getCounters()
is null etc.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
refactored the code
final ServiceMetricEvent.Builder metricBuilder = new ServiceMetricEvent.Builder(); | ||
IndexTaskUtils.setTaskDimensions(metricBuilder, task); | ||
toolbox.getEmitter().emit( | ||
metricBuilder.setMetric("ingest/processed/bytes", rowIngestionMeters.getProcessedBytes())); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Shouldn't this metric be emitted once per task probably at the end of the run
method?
The other task types seem to be doing that.
@neha-ellur , just found this PR #14582 . We probably just need to wire up things for MSQ tasks. |
A new metric
ingest/processed/bytes
has been introduced to track the total number of bytes processed during ingestion tasks, including native batch ingestion, streaming ingestion, and multi-stage query (MSQ) ingestion tasks. This metric helps provide a unified view of data processing across different ingestion pathways.Key changed/added classes in this PR
This metric was added in three key ingestion task classes:
This PR has: