/* * Copyright 2015 NAVER Corp. * * 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. * See the License for the specific language governing permissions and * limitations under the License. */ package com.navercorp.pinpoint.plugin.thrift; import java.net.InetSocketAddress; import java.net.SocketAddress; import java.util.regex.Pattern; import org.apache.thrift.TBaseAsyncProcessor; import org.apache.thrift.TBaseProcessor; import org.apache.thrift.TServiceClient; import org.apache.thrift.async.TAsyncMethodCall; /** * @author HyunGil Jeong */ public class ThriftUtils { private static final Pattern DOT_PATTERN = Pattern.compile("\\."); private ThriftUtils() {} private static String convertDotPathToUriPath(String dotPath) { if (dotPath == null) { return ""; } return DOT_PATTERN.matcher(dotPath).replaceAll("/"); } /** * Returns the name of the specified {@link org.apache.thrift.TBaseProcessor TBaseProcessor} * as uri to be used in Pinpoint. */ public static String getProcessorNameAsUri(TBaseProcessor<?> processor) { String actualProcessorName = processor.getClass().getName(); return convertDotPathToUriPath(ThriftConstants.PROCESSOR_PATTERN.matcher(actualProcessorName).replaceAll(".")); } /** * Returns the name of the specified {@link org.apache.thrift.TBaseAsyncProcessor TBaseAsyncProcessor} * as uri to be used in Pinpoint. */ public static String getAsyncProcessorNameAsUri(TBaseAsyncProcessor<?> asyncProcessor) { String actualAsyncProcessorName = asyncProcessor.getClass().getName(); return convertDotPathToUriPath(ThriftConstants.ASYNC_PROCESSOR_PATTERN.matcher(actualAsyncProcessorName).replaceAll(".")); } /** * Returns the name of the specified {@link org.apache.thrift.TServiceClient TServiceClient} * to be used in Pinpoint. */ public static String getClientServiceName(TServiceClient client) { String clientClassName = client.getClass().getName(); return convertDotPathToUriPath(ThriftConstants.CLIENT_PATTERN.split(clientClassName)[0]); } /** * Returns the name of the specified {@link org.apache.thrift.async.TAsyncMethodCall TAsyncMethodCall} * to be used in Pinpoint. */ public static String getAsyncMethodCallName(TAsyncMethodCall<?> asyncMethodCall) { String asyncMethodCallClassName = asyncMethodCall.getClass().getName(); return convertDotPathToUriPath(ThriftConstants.ASYNC_METHOD_CALL_PATTERN.matcher(asyncMethodCallClassName).replaceAll(".")); } /** * Returns the ip address retrieved from the given {@link SocketAddress}. * * @param socketAddress the <tt>SocketAddress</tt> instance to retrieve the ip address from * @return the ip address retrieved from the given <tt>socketAddress</tt>, * or {@literal ThriftConstants.UNKNOWN_ADDRESS} if it cannot be retrieved */ // TODO should probably be pulled up as a common API public static String getIp(SocketAddress socketAddress) { if (socketAddress == null) { return ThriftConstants.UNKNOWN_ADDRESS; } if (socketAddress instanceof InetSocketAddress) { InetSocketAddress addr = (InetSocketAddress)socketAddress; return addr.getAddress().getHostAddress(); } return getSocketAddress(socketAddress); } /** * Returns the ip and port information retrieved from the given {@link SocketAddress}. * * @param socketAddress the <tt>SocketAddress</tt> instance to retrieve the ip/port information from * @return the ip/port retrieved from the given <tt>socketAddress</tt>, * or {@literal ThriftConstants.UNKNOWN_ADDRESS} if it cannot be retrieved */ // TODO should probably be pulled up as a common API public static String getIpPort(SocketAddress socketAddress) { if (socketAddress == null) { return ThriftConstants.UNKNOWN_ADDRESS; } if (socketAddress instanceof InetSocketAddress) { InetSocketAddress addr = (InetSocketAddress)socketAddress; return addr.getAddress().getHostAddress() + ":" + addr.getPort(); } return getSocketAddress(socketAddress); } /** * Returns the hostname information retrieved from the given {@link SocketAddress}. * * @param socketAddress the <tt>SocketAddress</tt> instance to retrieve the host information from * @return the host retrieved from the given <tt>socketAddress</tt>, * or {@literal ThriftConstants.UNKNOWN_ADDRESS} if it cannot be retrieved */ // TODO should probably be pulled up as a common API public static String getHost(SocketAddress socketAddress) { if (socketAddress == null) { return ThriftConstants.UNKNOWN_ADDRESS; } if (socketAddress instanceof InetSocketAddress) { InetSocketAddress addr = (InetSocketAddress)socketAddress; return addr.getHostName(); } return getSocketAddress(socketAddress); } /** * Returns the hostname and port information retrieved from the given {@link SocketAddress}. * * @param socketAddress the <tt>SocketAddress</tt> instance to retrieve the host/port information from * @return the host/port retrieved from the given <tt>socketAddress</tt>, * or {@literal ThriftConstants.UNKNOWN_ADDRESS} if it cannot be retrieved */ // TODO should probably be pulled up as a common API public static String getHostPort(SocketAddress socketAddress) { if (socketAddress == null) { return ThriftConstants.UNKNOWN_ADDRESS; } if (socketAddress instanceof InetSocketAddress) { InetSocketAddress addr = (InetSocketAddress)socketAddress; return addr.getHostName() + ":" + addr.getPort(); } return getSocketAddress(socketAddress); } private static String getSocketAddress(SocketAddress socketAddress) { String address = socketAddress.toString(); int addressLength = address.length(); if (addressLength > 0) { if (address.startsWith("/")) { return address.substring(1); } else { final int delimeterIndex = address.indexOf('/'); if (delimeterIndex != -1 && delimeterIndex < addressLength) { return address.substring(address.indexOf('/') + 1); } } } return address; } }