1 /* 2 * Copyright 2017 The gRPC Authors 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package io.grpc.internal; 18 19 import static io.grpc.internal.TimeProvider.SYSTEM_TIME_PROVIDER; 20 21 import io.grpc.InternalChannelz.ChannelStats; 22 import io.grpc.InternalChannelz.ServerStats; 23 24 /** 25 * A collection of call stats for channelz. 26 */ 27 final class CallTracer { 28 private final TimeProvider timeProvider; 29 private final LongCounter callsStarted = LongCounterFactory.create(); 30 private final LongCounter callsSucceeded = LongCounterFactory.create(); 31 private final LongCounter callsFailed = LongCounterFactory.create(); 32 private volatile long lastCallStartedNanos; 33 CallTracer(TimeProvider timeProvider)34 CallTracer(TimeProvider timeProvider) { 35 this.timeProvider = timeProvider; 36 } 37 reportCallStarted()38 public void reportCallStarted() { 39 callsStarted.add(1); 40 lastCallStartedNanos = timeProvider.currentTimeNanos(); 41 } 42 reportCallEnded(boolean success)43 public void reportCallEnded(boolean success) { 44 if (success) { 45 callsSucceeded.add(1); 46 } else { 47 callsFailed.add(1); 48 } 49 } 50 updateBuilder(ChannelStats.Builder builder)51 void updateBuilder(ChannelStats.Builder builder) { 52 builder 53 .setCallsStarted(callsStarted.value()) 54 .setCallsSucceeded(callsSucceeded.value()) 55 .setCallsFailed(callsFailed.value()) 56 .setLastCallStartedNanos(lastCallStartedNanos); 57 } 58 updateBuilder(ServerStats.Builder builder)59 void updateBuilder(ServerStats.Builder builder) { 60 builder 61 .setCallsStarted(callsStarted.value()) 62 .setCallsSucceeded(callsSucceeded.value()) 63 .setCallsFailed(callsFailed.value()) 64 .setLastCallStartedNanos(lastCallStartedNanos); 65 } 66 67 public interface Factory { create()68 CallTracer create(); 69 } 70 71 static final Factory DEFAULT_FACTORY = new Factory() { 72 @Override 73 public CallTracer create() { 74 return new CallTracer(SYSTEM_TIME_PROVIDER); 75 } 76 }; 77 getDefaultFactory()78 public static Factory getDefaultFactory() { 79 return DEFAULT_FACTORY; 80 } 81 } 82