001/* 002 * 003 * Licensed to the Apache Software Foundation (ASF) under one 004 * or more contributor license agreements. See the NOTICE file 005 * distributed with this work for additional information 006 * regarding copyright ownership. The ASF licenses this file 007 * to you under the Apache License, Version 2.0 (the 008 * "License"); you may not use this file except in compliance 009 * with the License. You may obtain a copy of the License at 010 * 011 * http://www.apache.org/licenses/LICENSE-2.0 012 * 013 * Unless required by applicable law or agreed to in writing, software 014 * distributed under the License is distributed on an "AS IS" BASIS, 015 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 016 * See the License for the specific language governing permissions and 017 * limitations under the License. 018 */ 019 020package org.apache.hadoop.hbase.regionserver.slowlog; 021 022import java.util.ArrayList; 023import java.util.List; 024import org.apache.commons.lang3.StringUtils; 025import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos; 026import org.apache.hadoop.hbase.shaded.protobuf.generated.TooSlowLog; 027import org.apache.yetus.audience.InterfaceAudience; 028 029/** 030 * Event Handler utility class 031 */ 032@InterfaceAudience.Private 033class LogHandlerUtils { 034 035 private static int getTotalFiltersCount(AdminProtos.SlowLogResponseRequest request) { 036 int totalFilters = 0; 037 if (StringUtils.isNotEmpty(request.getRegionName())) { 038 totalFilters++; 039 } 040 if (StringUtils.isNotEmpty(request.getTableName())) { 041 totalFilters++; 042 } 043 if (StringUtils.isNotEmpty(request.getClientAddress())) { 044 totalFilters++; 045 } 046 if (StringUtils.isNotEmpty(request.getUserName())) { 047 totalFilters++; 048 } 049 return totalFilters; 050 } 051 052 private static List<TooSlowLog.SlowLogPayload> filterLogs( 053 AdminProtos.SlowLogResponseRequest request, 054 List<TooSlowLog.SlowLogPayload> slowLogPayloadList, int totalFilters) { 055 List<TooSlowLog.SlowLogPayload> filteredSlowLogPayloads = new ArrayList<>(); 056 final String regionName = 057 StringUtils.isNotEmpty(request.getRegionName()) ? request.getRegionName() : null; 058 final String tableName = 059 StringUtils.isNotEmpty(request.getTableName()) ? request.getTableName() : null; 060 final String clientAddress = 061 StringUtils.isNotEmpty(request.getClientAddress()) ? request.getClientAddress() : null; 062 final String userName = 063 StringUtils.isNotEmpty(request.getUserName()) ? request.getUserName() : null; 064 for (TooSlowLog.SlowLogPayload slowLogPayload : slowLogPayloadList) { 065 int totalFilterMatches = 0; 066 if (slowLogPayload.getRegionName().equals(regionName)) { 067 totalFilterMatches++; 068 } 069 if (tableName != null && slowLogPayload.getRegionName().startsWith(tableName)) { 070 totalFilterMatches++; 071 } 072 if (slowLogPayload.getClientAddress().equals(clientAddress)) { 073 totalFilterMatches++; 074 } 075 if (slowLogPayload.getUserName().equals(userName)) { 076 totalFilterMatches++; 077 } 078 if (request.hasFilterByOperator() && request.getFilterByOperator() 079 .equals(AdminProtos.SlowLogResponseRequest.FilterByOperator.AND)) { 080 // Filter by AND operator 081 if (totalFilterMatches == totalFilters) { 082 filteredSlowLogPayloads.add(slowLogPayload); 083 } 084 } else { 085 // Filter by OR operator 086 if (totalFilterMatches > 0) { 087 filteredSlowLogPayloads.add(slowLogPayload); 088 } 089 } 090 } 091 return filteredSlowLogPayloads; 092 } 093 094 static List<TooSlowLog.SlowLogPayload> getFilteredLogs( 095 AdminProtos.SlowLogResponseRequest request, List<TooSlowLog.SlowLogPayload> logPayloadList) { 096 int totalFilters = getTotalFiltersCount(request); 097 if (totalFilters > 0) { 098 logPayloadList = filterLogs(request, logPayloadList, totalFilters); 099 } 100 int limit = Math.min(request.getLimit(), logPayloadList.size()); 101 return logPayloadList.subList(0, limit); 102 } 103 104}