/* * Copyright 2014-2017 Real Logic Ltd. * * Licensed 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. */ package io.aeron.driver.status; import org.agrona.collections.Int2ObjectHashMap; import org.agrona.concurrent.status.AtomicCounter; import org.agrona.concurrent.status.CountersManager; /** * System wide counters for monitoring. These are separate from counters used for position tracking on streams. */ public enum SystemCounterDescriptor { BYTES_SENT(0, "Bytes sent"), BYTES_RECEIVED(1, "Bytes received"), RECEIVER_PROXY_FAILS(2, "Failed offers to ReceiverProxy"), SENDER_PROXY_FAILS(3, "Failed offers to SenderProxy"), CONDUCTOR_PROXY_FAILS(4, "Failed offers to DriverConductorProxy"), NAK_MESSAGES_SENT(5, "NAKs sent"), NAK_MESSAGES_RECEIVED(6, "NAKs received"), STATUS_MESSAGES_SENT(7, "Status Messages sent"), STATUS_MESSAGES_RECEIVED(8, "Status Messages received"), HEARTBEATS_SENT(9, "Heartbeats sent"), HEARTBEATS_RECEIVED(10, "Heartbeats received"), RETRANSMITS_SENT(11, "Retransmits sent"), FLOW_CONTROL_UNDER_RUNS(12, "Flow control under runs"), FLOW_CONTROL_OVER_RUNS(13, "Flow control over runs"), INVALID_PACKETS(14, "Invalid packets"), ERRORS(15, "Errors"), SHORT_SENDS(16, "Short sends"), CLIENT_KEEP_ALIVES(17, "Client keep-alives"), SENDER_FLOW_CONTROL_LIMITS(18, "Sender flow control limits applied"), UNBLOCKED_PUBLICATIONS(19, "Unblocked Publications"), UNBLOCKED_COMMANDS(20, "Unblocked Control Commands"), POSSIBLE_TTL_ASYMMETRY(21, "Possible TTL Asymmetry"), CONTROLLABLE_IDLE_STRATEGY(22, "ControllableIdleStrategy status"), LOSS_GAP_FILLS(23, "Loss gap fills"); /** * All system counters have the same type id, i.e. system counters are the same type. Others types can exist. */ public static final int SYSTEM_COUNTER_TYPE_ID = 0; private static final Int2ObjectHashMap<SystemCounterDescriptor> DESCRIPTOR_BY_ID_MAP = new Int2ObjectHashMap<>(); static { for (final SystemCounterDescriptor descriptor : SystemCounterDescriptor.values()) { if (null != DESCRIPTOR_BY_ID_MAP.put(descriptor.id, descriptor)) { throw new IllegalStateException("Descriptor id already in use: " + descriptor.id); } } } /** * Get the {@link SystemCounterDescriptor} for a given id. * * @param id for the descriptor. * @return the descriptor if found otherwise null. */ public static SystemCounterDescriptor get(final int id) { return DESCRIPTOR_BY_ID_MAP.get(id); } private final int id; private final String label; SystemCounterDescriptor(final int id, final String label) { this.id = id; this.label = label; } /** * The unique identity for the system counter. * * @return the unique identity for the system counter. */ public int id() { return id; } /** * The human readable label to identify a system counter. * * @return the human readable label to identify a system counter. */ public String label() { return label; } /** * Create a new counter for the enumerated descriptor. * * @param countersManager for managing the underlying storage. * @return a new counter for the enumerated descriptor. */ public AtomicCounter newCounter(final CountersManager countersManager) { return countersManager.newCounter(label, SYSTEM_COUNTER_TYPE_ID, (buffer) -> buffer.putInt(0, id)); } }