/** * Copyright 2016 LinkedIn Corp. All rights reserved. * * 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. */ package com.github.ambry.server; import com.codahale.metrics.Counter; import com.codahale.metrics.Histogram; import com.codahale.metrics.Meter; import com.codahale.metrics.MetricRegistry; /** * Metrics for the server */ public class ServerMetrics { public static final long smallBlob = 50 * 1024; // up to and including 50KB public static final long mediumBlob = 1 * 1024 * 1024; // up to and including 1MB // largeBlob is everything larger than mediumBlob public final Histogram putBlobRequestQueueTimeInMs; public final Histogram putBlobProcessingTimeInMs; public final Histogram putBlobResponseQueueTimeInMs; public final Histogram putBlobSendTimeInMs; public final Histogram putBlobTotalTimeInMs; public final Histogram putSmallBlobProcessingTimeInMs; public final Histogram putSmallBlobSendTimeInMs; public final Histogram putSmallBlobTotalTimeInMs; public final Histogram putMediumBlobProcessingTimeInMs; public final Histogram putMediumBlobSendTimeInMs; public final Histogram putMediumBlobTotalTimeInMs; public final Histogram putLargeBlobProcessingTimeInMs; public final Histogram putLargeBlobSendTimeInMs; public final Histogram putLargeBlobTotalTimeInMs; public final Histogram getBlobRequestQueueTimeInMs; public final Histogram getBlobProcessingTimeInMs; public final Histogram getBlobResponseQueueTimeInMs; public final Histogram getBlobSendTimeInMs; public final Histogram getBlobTotalTimeInMs; public final Histogram getSmallBlobProcessingTimeInMs; public final Histogram getSmallBlobSendTimeInMs; public final Histogram getSmallBlobTotalTimeInMs; public final Histogram getMediumBlobProcessingTimeInMs; public final Histogram getMediumBlobSendTimeInMs; public final Histogram getMediumBlobTotalTimeInMs; public final Histogram getLargeBlobProcessingTimeInMs; public final Histogram getLargeBlobSendTimeInMs; public final Histogram getLargeBlobTotalTimeInMs; public final Histogram getBlobPropertiesRequestQueueTimeInMs; public final Histogram getBlobPropertiesProcessingTimeInMs; public final Histogram getBlobPropertiesResponseQueueTimeInMs; public final Histogram getBlobPropertiesSendTimeInMs; public final Histogram getBlobPropertiesTotalTimeInMs; public final Histogram getBlobUserMetadataRequestQueueTimeInMs; public final Histogram getBlobUserMetadataProcessingTimeInMs; public final Histogram getBlobUserMetadataResponseQueueTimeInMs; public final Histogram getBlobUserMetadataSendTimeInMs; public final Histogram getBlobUserMetadataTotalTimeInMs; public final Histogram getBlobAllRequestQueueTimeInMs; public final Histogram getBlobAllProcessingTimeInMs; public final Histogram getBlobAllResponseQueueTimeInMs; public final Histogram getBlobAllSendTimeInMs; public final Histogram getBlobAllTotalTimeInMs; public final Histogram getBlobInfoRequestQueueTimeInMs; public final Histogram getBlobInfoProcessingTimeInMs; public final Histogram getBlobInfoResponseQueueTimeInMs; public final Histogram getBlobInfoSendTimeInMs; public final Histogram getBlobInfoTotalTimeInMs; public final Histogram deleteBlobRequestQueueTimeInMs; public final Histogram deleteBlobProcessingTimeInMs; public final Histogram deleteBlobResponseQueueTimeInMs; public final Histogram deleteBlobSendTimeInMs; public final Histogram deleteBlobTotalTimeInMs; public final Histogram ttlBlobRequestQueueTimeInMs; public final Histogram ttlBlobProcessingTimeInMs; public final Histogram ttlBlobResponseQueueTimeInMs; public final Histogram ttlBlobSendTimeInMs; public final Histogram ttlBlobTotalTimeInMs; public final Histogram replicaMetadataRequestQueueTimeInMs; public final Histogram replicaMetadataRequestProcessingTimeInMs; public final Histogram replicaMetadataResponseQueueTimeInMs; public final Histogram replicaMetadataSendTimeInMs; public final Histogram replicaMetadataTotalTimeInMs; public final Histogram triggerCompactionRequestQueueTimeInMs; public final Histogram triggerCompactionRequestProcessingTimeInMs; public final Histogram triggerCompactionResponseQueueTimeInMs; public final Histogram triggerCompactionResponseSendTimeInMs; public final Histogram triggerCompactionRequestTotalTimeInMs; public final Histogram blobSizeInBytes; public final Histogram blobUserMetadataSizeInBytes; public final Histogram serverStartTimeInMs; public final Histogram serverShutdownTimeInMs; public final Meter putBlobRequestRate; public final Meter getBlobRequestRate; public final Meter getBlobPropertiesRequestRate; public final Meter getBlobUserMetadataRequestRate; public final Meter getBlobAllRequestRate; public final Meter getBlobInfoRequestRate; public final Meter deleteBlobRequestRate; public final Meter ttlBlobRequestRate; public final Meter replicaMetadataRequestRate; public final Meter triggerCompactionRequestRate; public final Meter putSmallBlobRequestRate; public final Meter getSmallBlobRequestRate; public final Meter putMediumBlobRequestRate; public final Meter getMediumBlobRequestRate; public final Meter putLargeBlobRequestRate; public final Meter getLargeBlobRequestRate; public final Counter partitionUnknownError; public final Counter diskUnavailableError; public final Counter partitionReadOnlyError; public final Counter storeIOError; public final Counter unExpectedStorePutError; public final Counter unExpectedStoreGetError; public final Counter unExpectedStoreTTLError; public final Counter unExpectedStoreDeleteError; public final Counter unExpectedAdminOperationError; public final Counter unExpectedStoreFindEntriesError; public final Counter idAlreadyExistError; public final Counter dataCorruptError; public final Counter unknownFormatError; public final Counter idNotFoundError; public final Counter idDeletedError; public final Counter ttlExpiredError; public ServerMetrics(MetricRegistry registry) { putBlobRequestQueueTimeInMs = registry.histogram(MetricRegistry.name(AmbryRequests.class, "PutBlobRequestQueueTime")); putBlobProcessingTimeInMs = registry.histogram(MetricRegistry.name(AmbryRequests.class, "PutBlobProcessingTime")); putBlobResponseQueueTimeInMs = registry.histogram(MetricRegistry.name(AmbryRequests.class, "PutBlobResponseQueueTime")); putBlobSendTimeInMs = registry.histogram(MetricRegistry.name(AmbryRequests.class, "PutBlobSendTime")); putBlobTotalTimeInMs = registry.histogram(MetricRegistry.name(AmbryRequests.class, "PutBlobTotalTime")); putSmallBlobProcessingTimeInMs = registry.histogram(MetricRegistry.name(AmbryRequests.class, "PutSmallBlobProcessingTime")); putSmallBlobSendTimeInMs = registry.histogram(MetricRegistry.name(AmbryRequests.class, "PutSmallBlobSendTime")); putSmallBlobTotalTimeInMs = registry.histogram(MetricRegistry.name(AmbryRequests.class, "PutSmallBlobTotalTime")); putMediumBlobProcessingTimeInMs = registry.histogram(MetricRegistry.name(AmbryRequests.class, "PutMediumBlobProcessingTime")); putMediumBlobSendTimeInMs = registry.histogram(MetricRegistry.name(AmbryRequests.class, "PutMediumBlobSendTime")); putMediumBlobTotalTimeInMs = registry.histogram(MetricRegistry.name(AmbryRequests.class, "PutMediumBlobTotalTime")); putLargeBlobProcessingTimeInMs = registry.histogram(MetricRegistry.name(AmbryRequests.class, "PutLargeBlobProcessingTime")); putLargeBlobSendTimeInMs = registry.histogram(MetricRegistry.name(AmbryRequests.class, "PutLargeBlobSendTime")); putLargeBlobTotalTimeInMs = registry.histogram(MetricRegistry.name(AmbryRequests.class, "PutLargeBlobTotalTime")); getBlobRequestQueueTimeInMs = registry.histogram(MetricRegistry.name(AmbryRequests.class, "GetBlobRequestQueueTime")); getBlobProcessingTimeInMs = registry.histogram(MetricRegistry.name(AmbryRequests.class, "GetBlobProcessingTime")); getBlobResponseQueueTimeInMs = registry.histogram(MetricRegistry.name(AmbryRequests.class, "GetBlobResponseQueueTime")); getBlobSendTimeInMs = registry.histogram(MetricRegistry.name(AmbryRequests.class, "GetBlobSendTime")); getBlobTotalTimeInMs = registry.histogram(MetricRegistry.name(AmbryRequests.class, "GetBlobTotalTime")); getSmallBlobProcessingTimeInMs = registry.histogram(MetricRegistry.name(AmbryRequests.class, "GetSmallBlobProcessingTime")); getSmallBlobSendTimeInMs = registry.histogram(MetricRegistry.name(AmbryRequests.class, "GetSmallBlobSendTime")); getSmallBlobTotalTimeInMs = registry.histogram(MetricRegistry.name(AmbryRequests.class, "GetSmallBlobTotalTime")); getMediumBlobProcessingTimeInMs = registry.histogram(MetricRegistry.name(AmbryRequests.class, "GetMediumBlobProcessingTime")); getMediumBlobSendTimeInMs = registry.histogram(MetricRegistry.name(AmbryRequests.class, "GetMediumBlobSendTime")); getMediumBlobTotalTimeInMs = registry.histogram(MetricRegistry.name(AmbryRequests.class, "GetMediumBlobTotalTime")); getLargeBlobProcessingTimeInMs = registry.histogram(MetricRegistry.name(AmbryRequests.class, "GetLargeBlobProcessingTime")); getLargeBlobSendTimeInMs = registry.histogram(MetricRegistry.name(AmbryRequests.class, "GetLargeBlobSendTime")); getLargeBlobTotalTimeInMs = registry.histogram(MetricRegistry.name(AmbryRequests.class, "GetLargeBlobTotalTime")); getBlobPropertiesRequestQueueTimeInMs = registry.histogram(MetricRegistry.name(AmbryRequests.class, "GetBlobPropertiesRequestQueueTime")); getBlobPropertiesProcessingTimeInMs = registry.histogram(MetricRegistry.name(AmbryRequests.class, "GetBlobPropertiesProcessingTime")); getBlobPropertiesResponseQueueTimeInMs = registry.histogram(MetricRegistry.name(AmbryRequests.class, "GetBlobPropertiesResponseQueueTime")); getBlobPropertiesSendTimeInMs = registry.histogram(MetricRegistry.name(AmbryRequests.class, "GetBlobPropertiesSendTime")); getBlobPropertiesTotalTimeInMs = registry.histogram(MetricRegistry.name(AmbryRequests.class, "GetBlobPropertiesTotalTime")); getBlobUserMetadataRequestQueueTimeInMs = registry.histogram(MetricRegistry.name(AmbryRequests.class, "GetBlobUserMetadataRequestQueueTime")); getBlobUserMetadataProcessingTimeInMs = registry.histogram(MetricRegistry.name(AmbryRequests.class, "GetBlobUserMetadataProcessingTime")); getBlobUserMetadataResponseQueueTimeInMs = registry.histogram(MetricRegistry.name(AmbryRequests.class, "GetBlobUserMetadataResponseQueueTime")); getBlobUserMetadataSendTimeInMs = registry.histogram(MetricRegistry.name(AmbryRequests.class, "GetBlobUserMetadataSendTime")); getBlobUserMetadataTotalTimeInMs = registry.histogram(MetricRegistry.name(AmbryRequests.class, "GetBlobUserMetadataTotalTime")); getBlobAllRequestQueueTimeInMs = registry.histogram(MetricRegistry.name(AmbryRequests.class, "GetBlobAllRequestQueueTime")); getBlobAllProcessingTimeInMs = registry.histogram(MetricRegistry.name(AmbryRequests.class, "GetBlobAllProcessingTime")); getBlobAllResponseQueueTimeInMs = registry.histogram(MetricRegistry.name(AmbryRequests.class, "GetBlobAllResponseQueueTime")); getBlobAllSendTimeInMs = registry.histogram(MetricRegistry.name(AmbryRequests.class, "GetBlobAllSendTime")); getBlobAllTotalTimeInMs = registry.histogram(MetricRegistry.name(AmbryRequests.class, "GetBlobAllTotalTime")); getBlobInfoRequestQueueTimeInMs = registry.histogram(MetricRegistry.name(AmbryRequests.class, "GetBlobInfoRequestQueueTime")); getBlobInfoProcessingTimeInMs = registry.histogram(MetricRegistry.name(AmbryRequests.class, "GetBlobInfoProcessingTime")); getBlobInfoResponseQueueTimeInMs = registry.histogram(MetricRegistry.name(AmbryRequests.class, "GetBlobInfoResponseQueueTime")); getBlobInfoSendTimeInMs = registry.histogram(MetricRegistry.name(AmbryRequests.class, "GetBlobInfoSendTime")); getBlobInfoTotalTimeInMs = registry.histogram(MetricRegistry.name(AmbryRequests.class, "GetBlobInfoTotalTime")); deleteBlobRequestQueueTimeInMs = registry.histogram(MetricRegistry.name(AmbryRequests.class, "DeleteBlobRequestQueueTime")); deleteBlobProcessingTimeInMs = registry.histogram(MetricRegistry.name(AmbryRequests.class, "DeleteBlobProcessingTime")); deleteBlobResponseQueueTimeInMs = registry.histogram(MetricRegistry.name(AmbryRequests.class, "DeleteBlobResponseQueueTime")); deleteBlobSendTimeInMs = registry.histogram(MetricRegistry.name(AmbryRequests.class, "DeleteBlobSendTime")); deleteBlobTotalTimeInMs = registry.histogram(MetricRegistry.name(AmbryRequests.class, "DeleteBlobTotalTime")); ttlBlobRequestQueueTimeInMs = registry.histogram(MetricRegistry.name(AmbryRequests.class, "TTLBlobRequestQueueTime")); ttlBlobProcessingTimeInMs = registry.histogram(MetricRegistry.name(AmbryRequests.class, "TTLBlobProcessingTime")); ttlBlobResponseQueueTimeInMs = registry.histogram(MetricRegistry.name(AmbryRequests.class, "TTLBlobResponseQueueTime")); ttlBlobSendTimeInMs = registry.histogram(MetricRegistry.name(AmbryRequests.class, "TTLBlobSendTime")); ttlBlobTotalTimeInMs = registry.histogram(MetricRegistry.name(AmbryRequests.class, "TTLBlobTotalTime")); replicaMetadataRequestQueueTimeInMs = registry.histogram(MetricRegistry.name(AmbryRequests.class, "ReplicaMetadataRequestQueueTime")); replicaMetadataRequestProcessingTimeInMs = registry.histogram(MetricRegistry.name(AmbryRequests.class, "ReplicaMetadataRequestProcessingTime")); replicaMetadataResponseQueueTimeInMs = registry.histogram(MetricRegistry.name(AmbryRequests.class, "ReplicaMetadataResponseQueueTime")); replicaMetadataSendTimeInMs = registry.histogram(MetricRegistry.name(AmbryRequests.class, "ReplicaMetadataSendTime")); replicaMetadataTotalTimeInMs = registry.histogram(MetricRegistry.name(AmbryRequests.class, "ReplicaMetadataTotalTime")); triggerCompactionRequestQueueTimeInMs = registry.histogram(MetricRegistry.name(AmbryRequests.class, "TriggerCompactionRequestQueueTimeInMs")); triggerCompactionRequestProcessingTimeInMs = registry.histogram(MetricRegistry.name(AmbryRequests.class, "TriggerCompactionRequestProcessingTimeInMs")); triggerCompactionResponseQueueTimeInMs = registry.histogram(MetricRegistry.name(AmbryRequests.class, "TriggerCompactionResponseQueueTimeInMs")); triggerCompactionResponseSendTimeInMs = registry.histogram(MetricRegistry.name(AmbryRequests.class, "TriggerCompactionResponseSendTimeInMs")); triggerCompactionRequestTotalTimeInMs = registry.histogram(MetricRegistry.name(AmbryRequests.class, "TriggerCompactionRequestTotalTimeInMs")); blobSizeInBytes = registry.histogram(MetricRegistry.name(AmbryRequests.class, "BlobSize")); blobUserMetadataSizeInBytes = registry.histogram(MetricRegistry.name(AmbryRequests.class, "BlobUserMetadataSize")); serverStartTimeInMs = registry.histogram(MetricRegistry.name(AmbryServer.class, "ServerStartTimeInMs")); serverShutdownTimeInMs = registry.histogram(MetricRegistry.name(AmbryServer.class, "ServerShutdownTimeInMs")); putBlobRequestRate = registry.meter(MetricRegistry.name(AmbryRequests.class, "PutBlobRequestRate")); getBlobRequestRate = registry.meter(MetricRegistry.name(AmbryRequests.class, "GetBlobRequestRate")); getBlobPropertiesRequestRate = registry.meter(MetricRegistry.name(AmbryRequests.class, "GetBlobPropertiesRequestRate")); getBlobUserMetadataRequestRate = registry.meter(MetricRegistry.name(AmbryRequests.class, "GetBlobUserMetadataRequestRate")); getBlobAllRequestRate = registry.meter(MetricRegistry.name(AmbryRequests.class, "GetBlobAllRequestRate")); getBlobInfoRequestRate = registry.meter(MetricRegistry.name(AmbryRequests.class, "GetBlobInfoRequestRate")); deleteBlobRequestRate = registry.meter(MetricRegistry.name(AmbryRequests.class, "DeleteBlobRequestRate")); ttlBlobRequestRate = registry.meter(MetricRegistry.name(AmbryRequests.class, "TTLBlobRequestRate")); replicaMetadataRequestRate = registry.meter(MetricRegistry.name(AmbryRequests.class, "ReplicaMetadataRequestRate")); triggerCompactionRequestRate = registry.meter(MetricRegistry.name(AmbryRequests.class, "TriggerCompactionRequestRate")); putSmallBlobRequestRate = registry.meter(MetricRegistry.name(AmbryRequests.class, "PutSmallBlobRequestRate")); getSmallBlobRequestRate = registry.meter(MetricRegistry.name(AmbryRequests.class, "GetSmallBlobRequestRate")); putMediumBlobRequestRate = registry.meter(MetricRegistry.name(AmbryRequests.class, "PutMediumBlobRequestRate")); getMediumBlobRequestRate = registry.meter(MetricRegistry.name(AmbryRequests.class, "GetMediumBlobRequestRate")); putLargeBlobRequestRate = registry.meter(MetricRegistry.name(AmbryRequests.class, "PutLargeBlobRequestRate")); getLargeBlobRequestRate = registry.meter(MetricRegistry.name(AmbryRequests.class, "GetLargeBlobRequestRate")); partitionUnknownError = registry.counter(MetricRegistry.name(AmbryRequests.class, "PartitionUnknownError")); diskUnavailableError = registry.counter(MetricRegistry.name(AmbryRequests.class, "DiskUnavailableError")); partitionReadOnlyError = registry.counter(MetricRegistry.name(AmbryRequests.class, "PartitionReadOnlyError")); storeIOError = registry.counter(MetricRegistry.name(AmbryRequests.class, "StoreIOError")); idAlreadyExistError = registry.counter(MetricRegistry.name(AmbryRequests.class, "IDAlreadyExistError")); dataCorruptError = registry.counter(MetricRegistry.name(AmbryRequests.class, "DataCorruptError")); unknownFormatError = registry.counter(MetricRegistry.name(AmbryRequests.class, "UnknownFormatError")); idNotFoundError = registry.counter(MetricRegistry.name(AmbryRequests.class, "IDNotFoundError")); idDeletedError = registry.counter(MetricRegistry.name(AmbryRequests.class, "IDDeletedError")); ttlExpiredError = registry.counter(MetricRegistry.name(AmbryRequests.class, "TTLExpiredError")); unExpectedStorePutError = registry.counter(MetricRegistry.name(AmbryRequests.class, "UnexpectedStorePutError")); unExpectedStoreGetError = registry.counter(MetricRegistry.name(AmbryRequests.class, "UnexpectedStoreGetError")); unExpectedStoreDeleteError = registry.counter(MetricRegistry.name(AmbryRequests.class, "UnexpectedStoreDeleteError")); unExpectedAdminOperationError = registry.counter(MetricRegistry.name(AmbryRequests.class, "UnexpectedAdminOperationError")); unExpectedStoreTTLError = registry.counter(MetricRegistry.name(AmbryRequests.class, "UnexpectedStoreTTLError")); unExpectedStoreFindEntriesError = registry.counter(MetricRegistry.name(AmbryRequests.class, "UnexpectedStoreFindEntriesError")); } public void markPutBlobRequestRateBySize(long blobSize) { if (blobSize <= smallBlob) { putSmallBlobRequestRate.mark(); } else if (blobSize <= mediumBlob) { putMediumBlobRequestRate.mark(); } else { putLargeBlobRequestRate.mark(); } } public void markGetBlobRequestRateBySize(long blobSize) { if (blobSize <= smallBlob) { getSmallBlobRequestRate.mark(); } else if (blobSize <= mediumBlob) { getMediumBlobRequestRate.mark(); } else { getLargeBlobRequestRate.mark(); } } }