@@ -46,6 +46,13 @@ func TaskMetadataPath() string {
4646 utils .ConstructMuxVar (EndpointContainerIDMuxName , utils .AnythingButSlashRegEx ))
4747}
4848
49+ // Returns the standard URI path for tasks metadata endpoint.
50+ func TasksMetadataPath () string {
51+ return fmt .Sprintf (
52+ "/v4/%s/tasks" ,
53+ utils .ConstructMuxVar (EndpointContainerIDMuxName , utils .AnythingButSlashRegEx ))
54+ }
55+
4956// Returns the standard URI path for task metadata with tags endpoint.
5057func TaskMetadataWithTagsPath () string {
5158 return fmt .Sprintf (
@@ -65,6 +72,12 @@ func TaskStatsPath() string {
6572 utils .ConstructMuxVar (EndpointContainerIDMuxName , utils .AnythingButSlashRegEx ))
6673}
6774
75+ // Returns a standard URI path for v4 tasks stats endpoint.
76+ func TasksStatsPath () string {
77+ return fmt .Sprintf ("/v4/%s/tasks/stats" ,
78+ utils .ConstructMuxVar (EndpointContainerIDMuxName , utils .AnythingButSlashRegEx ))
79+ }
80+
6881// ContainerMetadataHandler returns the HTTP handler function for handling container metadata requests.
6982func ContainerMetadataHandler (
7083 agentState state.AgentState ,
@@ -123,6 +136,14 @@ func TaskMetadataHandler(
123136 return taskMetadataHandler (agentState , metricsFactory , false )
124137}
125138
139+ // TasksMetadataHandler returns the HTTP handler function for handling tasks metadata requests.
140+ func TasksMetadataHandler (
141+ agentState state.AgentState ,
142+ metricsFactory metrics.EntryFactory ,
143+ ) func (http.ResponseWriter , * http.Request ) {
144+ return tasksMetadataHandler (agentState , metricsFactory , false )
145+ }
146+
126147// TaskMetadataHandler returns the HTTP handler function for handling task metadata with tags requests.
127148func TaskMetadataWithTagsHandler (
128149 agentState state.AgentState ,
@@ -131,6 +152,14 @@ func TaskMetadataWithTagsHandler(
131152 return taskMetadataHandler (agentState , metricsFactory , true )
132153}
133154
155+ // TasksMetadataHandler returns the HTTP handler function for handling tasks metadata with tags requests.
156+ func TasksMetadataWithTagsHandler (
157+ agentState state.AgentState ,
158+ metricsFactory metrics.EntryFactory ,
159+ ) func (http.ResponseWriter , * http.Request ) {
160+ return tasksMetadataHandler (agentState , metricsFactory , true )
161+ }
162+
134163func taskMetadataHandler (
135164 agentState state.AgentState ,
136165 metricsFactory metrics.EntryFactory ,
@@ -169,6 +198,40 @@ func taskMetadataHandler(
169198 }
170199}
171200
201+ func tasksMetadataHandler (
202+ agentState state.AgentState ,
203+ metricsFactory metrics.EntryFactory ,
204+ includeTags bool ,
205+ ) func (http.ResponseWriter , * http.Request ) {
206+ return func (w http.ResponseWriter , r * http.Request ) {
207+ endpointContainerID := mux .Vars (r )[EndpointContainerIDMuxName ]
208+ var tasksMetadata []state.TaskResponse
209+ var err error
210+
211+ if includeTags {
212+ tasksMetadata , err = agentState .GetTasksMetadataWithTags (endpointContainerID )
213+ } else {
214+ tasksMetadata , err = agentState .GetTasksMetadata (endpointContainerID )
215+ }
216+
217+ if err != nil {
218+ logger .Error ("Failed to get v4 tasks metadata" , logger.Fields {
219+ field .Error : err ,
220+ })
221+
222+ utils .WriteJSONResponse (w , http .StatusInternalServerError ,
223+ "failed to get tasks metadata" , utils .RequestTypeTasksMetadata )
224+ metricsFactory .New (metrics .InternalServerErrorMetricName ).Done (err )
225+ return
226+ }
227+
228+ logger .Info ("Writing response for v4 tasks metadata" , logger.Fields {
229+ "task_count" : len (tasksMetadata ),
230+ })
231+ utils .WriteJSONResponse (w , http .StatusOK , tasksMetadata , utils .RequestTypeTasksMetadata )
232+ }
233+ }
234+
172235// Returns an appropriate HTTP response status code and body for the task metadata error.
173236func getTaskErrorResponse (endpointContainerID string , err error ) (int , string ) {
174237 var errContainerLookupFailed * state.ErrorLookupFailure
@@ -206,6 +269,38 @@ func TaskStatsHandler(
206269 utils .RequestTypeTaskStats , taskStatsErrorPrefix )
207270}
208271
272+ // Returns an HTTP handler for v4 tasks stats endpoint
273+ func TasksStatsHandler (
274+ agentState state.AgentState ,
275+ metricsFactory metrics.EntryFactory ,
276+ ) func (http.ResponseWriter , * http.Request ) {
277+ return func (w http.ResponseWriter , r * http.Request ) {
278+ endpointContainerID := mux .Vars (r )[EndpointContainerIDMuxName ]
279+ // Get stats for all tasks
280+ stats , err := agentState .GetTasksStats (endpointContainerID )
281+ if err != nil {
282+ logger .Error ("Failed to get v4 tasks stats" , logger.Fields {
283+ field .Error : err ,
284+ })
285+
286+ responseCode , responseBody := getStatsErrorResponse ("" , err , "V4 tasks stats handler" )
287+ utils .WriteJSONResponse (w , responseCode , responseBody , utils .RequestTypeTasksStats )
288+
289+ if utils .Is5XXStatus (responseCode ) {
290+ metricsFactory .New (metrics .InternalServerErrorMetricName ).Done (err )
291+ }
292+
293+ return
294+ }
295+
296+ // Write stats response
297+ logger .Info ("Writing response for v4 tasks stats" , logger.Fields {
298+ "task_count" : len (stats ),
299+ })
300+ utils .WriteJSONResponse (w , http .StatusOK , stats , utils .RequestTypeTasksStats )
301+ }
302+ }
303+
209304// Generic function that returns an HTTP handler for container or task stats endpoint
210305// depending on the parameters.
211306func statsHandler [R state.StatsResponse | map [string ]* state.StatsResponse ](
0 commit comments