@@ -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,39 @@ 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+ var tasksMetadata []state.TaskResponse
208+ var err error
209+
210+ if includeTags {
211+ tasksMetadata , err = agentState .GetTasksMetadataWithTags ()
212+ } else {
213+ tasksMetadata , err = agentState .GetTasksMetadata ()
214+ }
215+
216+ if err != nil {
217+ logger .Error ("Failed to get v4 tasks metadata" , logger.Fields {
218+ field .Error : err ,
219+ })
220+
221+ utils .WriteJSONResponse (w , http .StatusInternalServerError ,
222+ "failed to get tasks metadata" , utils .RequestTypeTasksMetadata )
223+ metricsFactory .New (metrics .InternalServerErrorMetricName ).Done (err )
224+ return
225+ }
226+
227+ logger .Info ("Writing response for v4 tasks metadata" , logger.Fields {
228+ "task_count" : len (tasksMetadata ),
229+ })
230+ utils .WriteJSONResponse (w , http .StatusOK , tasksMetadata , utils .RequestTypeTasksMetadata )
231+ }
232+ }
233+
172234// Returns an appropriate HTTP response status code and body for the task metadata error.
173235func getTaskErrorResponse (endpointContainerID string , err error ) (int , string ) {
174236 var errContainerLookupFailed * state.ErrorLookupFailure
@@ -206,6 +268,37 @@ func TaskStatsHandler(
206268 utils .RequestTypeTaskStats , taskStatsErrorPrefix )
207269}
208270
271+ // Returns an HTTP handler for v4 tasks stats endpoint
272+ func TasksStatsHandler (
273+ agentState state.AgentState ,
274+ metricsFactory metrics.EntryFactory ,
275+ ) func (http.ResponseWriter , * http.Request ) {
276+ return func (w http.ResponseWriter , r * http.Request ) {
277+ // Get stats for all tasks
278+ stats , err := agentState .GetTasksStats ("" )
279+ if err != nil {
280+ logger .Error ("Failed to get v4 tasks stats" , logger.Fields {
281+ field .Error : err ,
282+ })
283+
284+ responseCode , responseBody := getStatsErrorResponse ("" , err , "V4 tasks stats handler" )
285+ utils .WriteJSONResponse (w , responseCode , responseBody , utils .RequestTypeTasksStats )
286+
287+ if utils .Is5XXStatus (responseCode ) {
288+ metricsFactory .New (metrics .InternalServerErrorMetricName ).Done (err )
289+ }
290+
291+ return
292+ }
293+
294+ // Write stats response
295+ logger .Info ("Writing response for v4 tasks stats" , logger.Fields {
296+ "task_count" : len (stats ),
297+ })
298+ utils .WriteJSONResponse (w , http .StatusOK , stats , utils .RequestTypeTasksStats )
299+ }
300+ }
301+
209302// Generic function that returns an HTTP handler for container or task stats endpoint
210303// depending on the parameters.
211304func statsHandler [R state.StatsResponse | map [string ]* state.StatsResponse ](
0 commit comments