001/* 002 * Licensed to the Apache Software Foundation (ASF) under one 003 * or more contributor license agreements. See the NOTICE file 004 * distributed with this work for additional information 005 * regarding copyright ownership. The ASF licenses this file 006 * to you under the Apache License, Version 2.0 (the 007 * "License"); you may not use this file except in compliance 008 * with the License. You may obtain a copy of the License at 009 * 010 * http://www.apache.org/licenses/LICENSE-2.0 011 * 012 * Unless required by applicable law or agreed to in writing, software 013 * distributed under the License is distributed on an "AS IS" BASIS, 014 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 015 * See the License for the specific language governing permissions and 016 * limitations under the License. 017 */ 018package org.apache.hadoop.hbase; 019 020import java.nio.charset.StandardCharsets; 021import java.util.HashMap; 022import java.util.Map; 023import org.apache.hadoop.hbase.util.Strings; 024import org.apache.yetus.audience.InterfaceAudience; 025 026import org.apache.hbase.thirdparty.com.google.common.base.Preconditions; 027 028import org.apache.hadoop.hbase.shaded.protobuf.generated.ClusterStatusProtos; 029 030@InterfaceAudience.Private 031public final class UserMetricsBuilder { 032 033 public static UserMetrics toUserMetrics(ClusterStatusProtos.UserLoad userLoad) { 034 UserMetricsBuilder builder = 035 UserMetricsBuilder.newBuilder(userLoad.getUserName().getBytes(StandardCharsets.UTF_8)); 036 userLoad.getClientMetricsList().stream() 037 .map(clientMetrics -> new ClientMetricsImpl(clientMetrics.getHostName(), 038 clientMetrics.getReadRequestsCount(), clientMetrics.getWriteRequestsCount(), 039 clientMetrics.getFilteredRequestsCount(), clientMetrics.getHostAddress(), 040 clientMetrics.getUserName(), clientMetrics.getServiceName(), 041 clientMetrics.getClientVersion())) 042 .forEach(builder::addClientMetris); 043 return builder.build(); 044 } 045 046 public static ClusterStatusProtos.UserLoad toUserMetrics(UserMetrics userMetrics) { 047 ClusterStatusProtos.UserLoad.Builder builder = 048 ClusterStatusProtos.UserLoad.newBuilder().setUserName(userMetrics.getNameAsString()); 049 userMetrics.getClientMetrics().values().stream() 050 .map(clientMetrics -> ClusterStatusProtos.ClientMetrics.newBuilder() 051 .setHostName(clientMetrics.getHostName()) 052 .setWriteRequestsCount(clientMetrics.getWriteRequestsCount()) 053 .setReadRequestsCount(clientMetrics.getReadRequestsCount()) 054 .setFilteredRequestsCount(clientMetrics.getFilteredReadRequestsCount()) 055 .setHostAddress(clientMetrics.getHostAddress()).setUserName(clientMetrics.getUserName()) 056 .setServiceName(clientMetrics.getServiceName()) 057 .setClientVersion(clientMetrics.getClientVersion()).build()) 058 .forEach(builder::addClientMetrics); 059 return builder.build(); 060 } 061 062 public static UserMetricsBuilder newBuilder(byte[] name) { 063 return new UserMetricsBuilder(name); 064 } 065 066 private final byte[] name; 067 private Map<String, UserMetrics.ClientMetrics> clientMetricsMap = new HashMap<>(); 068 069 private UserMetricsBuilder(byte[] name) { 070 this.name = name; 071 } 072 073 public UserMetricsBuilder addClientMetris(UserMetrics.ClientMetrics clientMetrics) { 074 clientMetricsMap.put(clientMetrics.getHostName(), clientMetrics); 075 return this; 076 } 077 078 public UserMetrics build() { 079 return new UserMetricsImpl(name, clientMetricsMap); 080 } 081 082 public static class ClientMetricsImpl implements UserMetrics.ClientMetrics { 083 private final long filteredReadRequestsCount; 084 private final String hostName; 085 private final long readRequestCount; 086 private final long writeRequestCount; 087 private final String hostAddress; 088 private final String userName; 089 private final String serviceName; 090 private final String clientVersion; 091 092 public ClientMetricsImpl(String hostName, long readRequest, long writeRequest, 093 long filteredReadRequestsCount, String hostAddress, String userName, String serviceName, 094 String clientVersion) { 095 this.hostName = hostName; 096 this.readRequestCount = readRequest; 097 this.writeRequestCount = writeRequest; 098 this.filteredReadRequestsCount = filteredReadRequestsCount; 099 this.hostAddress = hostAddress != null ? hostAddress : "Unknown"; 100 this.userName = userName != null ? userName : "Unknown"; 101 this.serviceName = serviceName != null ? serviceName : "Unknown"; 102 this.clientVersion = clientVersion != null ? clientVersion : "Unknown"; 103 } 104 105 @Override 106 public String getHostName() { 107 return hostName; 108 } 109 110 @Override 111 public long getReadRequestsCount() { 112 return readRequestCount; 113 } 114 115 @Override 116 public long getWriteRequestsCount() { 117 return writeRequestCount; 118 } 119 120 @Override 121 public long getFilteredReadRequestsCount() { 122 return filteredReadRequestsCount; 123 } 124 125 @Override 126 public String getHostAddress() { 127 return hostAddress; 128 } 129 130 @Override 131 public String getUserName() { 132 return userName; 133 } 134 135 @Override 136 public String getServiceName() { 137 return serviceName; 138 } 139 140 @Override 141 public String getClientVersion() { 142 return clientVersion; 143 } 144 } 145 146 private static class UserMetricsImpl implements UserMetrics { 147 private final byte[] name; 148 private final Map<String, ClientMetrics> clientMetricsMap; 149 150 UserMetricsImpl(byte[] name, Map<String, ClientMetrics> clientMetricsMap) { 151 this.name = Preconditions.checkNotNull(name); 152 this.clientMetricsMap = clientMetricsMap; 153 } 154 155 @Override 156 public byte[] getUserName() { 157 return name; 158 } 159 160 @Override 161 public long getReadRequestCount() { 162 return clientMetricsMap.values().stream().map(c -> c.getReadRequestsCount()).reduce(0L, 163 Long::sum); 164 } 165 166 @Override 167 public long getWriteRequestCount() { 168 return clientMetricsMap.values().stream().map(c -> c.getWriteRequestsCount()).reduce(0L, 169 Long::sum); 170 } 171 172 @Override 173 public Map<String, ClientMetrics> getClientMetrics() { 174 return this.clientMetricsMap; 175 } 176 177 @Override 178 public long getFilteredReadRequests() { 179 return clientMetricsMap.values().stream().map(c -> c.getFilteredReadRequestsCount()) 180 .reduce(0L, Long::sum); 181 } 182 183 @Override 184 public String toString() { 185 StringBuilder sb = 186 Strings.appendKeyValue(new StringBuilder(), "readRequestCount", this.getReadRequestCount()); 187 Strings.appendKeyValue(sb, "writeRequestCount", this.getWriteRequestCount()); 188 Strings.appendKeyValue(sb, "filteredReadRequestCount", this.getFilteredReadRequests()); 189 return sb.toString(); 190 } 191 } 192 193}