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}