blob: 33d544a161720cbbdbd11075ea0f3046987fa587 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
#include "agent_router.h"
#include "config.h"
#include <inttypes.h>
#include <stdio.h>
#define QDR_ROUTER_NAME 0
#define QDR_ROUTER_IDENTITY 1
#define QDR_ROUTER_ID 2
#define QDR_ROUTER_TYPE 3
#define QDR_ROUTER_MODE 4
#define QDR_ROUTER_AREA 5
#define QDR_ROUTER_VERSION 6
#define QDR_ROUTER_METADATA 7
#define QDR_ROUTER_ADDR_COUNT 8
#define QDR_ROUTER_LINK_COUNT 9
#define QDR_ROUTER_NODE_COUNT 10
#define QDR_ROUTER_LINK_ROUTE_COUNT 11
#define QDR_ROUTER_AUTO_LINK_COUNT 12
#define QDR_ROUTER_CONNECTION_COUNT 13
#define QDR_ROUTER_PRESETTLED_DELIVERIES 14
#define QDR_ROUTER_DROPPED_PRESETTLED_DELIVERIES 15
#define QDR_ROUTER_ACCEPTED_DELIVERIES 16
#define QDR_ROUTER_REJECTED_DELIVERIES 17
#define QDR_ROUTER_RELEASED_DELIVERIES 18
#define QDR_ROUTER_MODIFIED_DELIVERIES 19
#define QDR_ROUTER_DELAYED_1SEC 20
#define QDR_ROUTER_DELAYED_10SEC 21
#define QDR_ROUTER_DELIVERIES_STUCK 22
#define QDR_ROUTER_DELIVERIES_INGRESS 23
#define QDR_ROUTER_DELIVERIES_EGRESS 24
#define QDR_ROUTER_DELIVERIES_TRANSIT 25
#define QDR_ROUTER_DELIVERIES_INGRESS_ROUTE_CONTAINER 26
#define QDR_ROUTER_DELIVERIES_EGRESS_ROUTE_CONTAINER 27
#define QDR_ROUTER_DELIVERIES_REDIRECTED 28
#define QDR_ROUTER_LINKS_BLOCKED 29
#define QDR_ROUTER_UPTIME_SECONDS 30
#define QDR_ROUTER_MEMORY_USAGE 31
#define QDR_ROUTER_WORKER_THREADS 32
const char *qdr_router_columns[] =
{"name",
"identity",
"id",
"type",
"mode",
"area",
"version",
"metadata",
"addrCount",
"linkCount",
"nodeCount",
"linkRouteCount",
"autoLinkCount",
"connectionCount",
"presettledDeliveries",
"droppedPresettledDeliveries",
"acceptedDeliveries",
"rejectedDeliveries",
"releasedDeliveries",
"modifiedDeliveries",
"deliveriesDelayed1Sec",
"deliveriesDelayed10Sec",
"deliveriesStuck",
"deliveriesIngress",
"deliveriesEgress",
"deliveriesTransit",
"deliveriesIngressRouteContainer",
"deliveriesEgressRouteContainer",
"deliveriesRedirectedToFallback",
"linksBlocked",
"uptimeSeconds",
"memoryUsage",
"workerThreads",
0};
static const char *qd_router_mode_names[] = {
"standalone",
"interior",
"edge",
"endpoint"
};
static const char *router_mode(qd_router_mode_t router_mode)
{
return qd_router_mode_names[(int)router_mode];
}
static void qdr_agent_write_column_CT(qd_composed_field_t *body, int col, qdr_core_t *core)
{
switch(col) {
case QDR_ROUTER_IDENTITY:
// There is only one instance of router. Just give it an identity of 1
qd_compose_insert_string(body, "1");
break;
case QDR_ROUTER_TYPE:
qd_compose_insert_string(body, "org.apache.qpid.dispatch.router");
break;
case QDR_ROUTER_MODE:
qd_compose_insert_string(body, router_mode(core->router_mode));
break;
case QDR_ROUTER_AREA:
if (core->router_area)
qd_compose_insert_string(body, core->router_area);
else
qd_compose_insert_null(body);
break;
case QDR_ROUTER_VERSION:
qd_compose_insert_string(body, QPID_DISPATCH_VERSION);
break;
case QDR_ROUTER_METADATA:
if (core->qd->metadata)
qd_compose_insert_string(body, core->qd->metadata);
else
qd_compose_insert_null(body);
break;
case QDR_ROUTER_ADDR_COUNT:
qd_compose_insert_ulong(body, DEQ_SIZE(core->addrs));
break;
case QDR_ROUTER_LINK_COUNT:
qd_compose_insert_ulong(body, DEQ_SIZE(core->open_links));
break;
case QDR_ROUTER_NODE_COUNT:
qd_compose_insert_ulong(body, DEQ_SIZE(core->routers));
break;
case QDR_ROUTER_CONNECTION_COUNT:
qd_compose_insert_ulong(body, DEQ_SIZE(core->open_connections));
break;
case QDR_ROUTER_LINK_ROUTE_COUNT:
qd_compose_insert_ulong(body, DEQ_SIZE(core->link_routes));
break;
case QDR_ROUTER_AUTO_LINK_COUNT:
qd_compose_insert_ulong(body, DEQ_SIZE(core->auto_links));
break;
case QDR_ROUTER_ID:
case QDR_ROUTER_NAME:
if (core->router_id)
qd_compose_insert_string(body, core->router_id);
else
qd_compose_insert_null(body);
break;
case QDR_ROUTER_PRESETTLED_DELIVERIES:
qd_compose_insert_ulong(body, core->presettled_deliveries);
break;
case QDR_ROUTER_DROPPED_PRESETTLED_DELIVERIES:
qd_compose_insert_ulong(body, core->dropped_presettled_deliveries);
break;
case QDR_ROUTER_ACCEPTED_DELIVERIES:
qd_compose_insert_ulong(body, core->accepted_deliveries);
break;
case QDR_ROUTER_REJECTED_DELIVERIES:
qd_compose_insert_ulong(body, core->rejected_deliveries);
break;
case QDR_ROUTER_RELEASED_DELIVERIES:
qd_compose_insert_ulong(body, core->released_deliveries);
break;
case QDR_ROUTER_MODIFIED_DELIVERIES:
qd_compose_insert_ulong(body, core->modified_deliveries);
break;
case QDR_ROUTER_DELAYED_1SEC:
qd_compose_insert_ulong(body, core->deliveries_delayed_1sec);
break;
case QDR_ROUTER_DELAYED_10SEC:
qd_compose_insert_ulong(body, core->deliveries_delayed_10sec);
break;
case QDR_ROUTER_DELIVERIES_STUCK:
qd_compose_insert_ulong(body, core->deliveries_stuck);
break;
case QDR_ROUTER_DELIVERIES_INGRESS:
qd_compose_insert_ulong(body, core->deliveries_ingress);
break;
case QDR_ROUTER_DELIVERIES_EGRESS:
qd_compose_insert_ulong(body, core->deliveries_egress);
break;
case QDR_ROUTER_DELIVERIES_TRANSIT:
qd_compose_insert_ulong(body, core->deliveries_transit);
break;
case QDR_ROUTER_DELIVERIES_INGRESS_ROUTE_CONTAINER:
qd_compose_insert_ulong(body, core->deliveries_ingress_route_container);
break;
case QDR_ROUTER_DELIVERIES_EGRESS_ROUTE_CONTAINER:
qd_compose_insert_ulong(body, core->deliveries_egress_route_container);
break;
case QDR_ROUTER_DELIVERIES_REDIRECTED:
qd_compose_insert_ulong(body, core->deliveries_redirected);
break;
case QDR_ROUTER_LINKS_BLOCKED:
qd_compose_insert_uint(body, core->links_blocked);
break;
case QDR_ROUTER_WORKER_THREADS:
qd_compose_insert_int(body, core->worker_thread_count);
break;
case QDR_ROUTER_UPTIME_SECONDS:
qd_compose_insert_uint(body, core->uptime_ticks);
break;
case QDR_ROUTER_MEMORY_USAGE: {
uint32_t size = qd_router_memory_usage();
if (size)
qd_compose_insert_ulong(body, size);
else // memory usage not available
qd_compose_insert_null(body);
} break;
default:
qd_compose_insert_null(body);
break;
}
}
static void qdr_agent_write_router_CT(qdr_query_t *query, qdr_core_t *core)
{
qd_composed_field_t *body = query->body;
qd_compose_start_list(body);
int i = 0;
while (query->columns[i] >= 0) {
qdr_agent_write_column_CT(body, query->columns[i], core);
i++;
}
qd_compose_end_list(body);
}
void qdra_router_get_first_CT(qdr_core_t *core, qdr_query_t *query, int offset)
{
//
// Queries that get this far will always succeed.
//
query->status = QD_AMQP_OK;
if (offset >= 1) {
query->more = false;
qdr_agent_enqueue_response_CT(core, query);
return;
}
//
// Write the columns of core into the response body.
//
qdr_agent_write_router_CT(query, core);
//
// Enqueue the response.
//
qdr_agent_enqueue_response_CT(core, query);
}
// Nothing to do here. The router has only one entry.
void qdra_router_get_next_CT(qdr_core_t *core, qdr_query_t *query)
{
}