/* * Copyright 1999-2017 Alibaba Group Holding Ltd. * * 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.alibaba.druid.support.profile; import java.util.LinkedHashMap; import java.util.Map; public class Profiler { public static final String PROFILE_TYPE_WEB = "WEB"; public static final String PROFILE_TYPE_SPRING = "SPRING"; public static final String PROFILE_TYPE_SQL = "SQL"; private static ThreadLocal<Map<ProfileEntryKey, ProfileEntryReqStat>> statsMapLocal = new ThreadLocal<Map<ProfileEntryKey, ProfileEntryReqStat>>(); private final static ThreadLocal<ProfileEntry> currentLocal = new ThreadLocal<ProfileEntry>(); public static boolean isEnable() { return statsMapLocal != null; } public static void enter(String name, String type) { if (!isEnable()) { return; } ProfileEntry parent = currentLocal.get(); String parentName = null; if (parent != null) { parentName = parent.getName(); } ProfileEntryKey key = new ProfileEntryKey(parentName, name, type); ProfileEntry entry = new ProfileEntry(parent, key); currentLocal.set(entry); } public static ProfileEntry current() { return currentLocal.get(); } public static void release(long nanos) { ProfileEntry current = currentLocal.get(); currentLocal.set(current.getParent()); ProfileEntryReqStat stat = null; Map<ProfileEntryKey, ProfileEntryReqStat> statsMap = statsMapLocal.get(); if (statsMap == null) { return; } stat = statsMap.get(current.getKey()); if (stat == null) { stat = new ProfileEntryReqStat(); statsMap.put(current.getKey(), stat); } stat.incrementExecuteCount(); stat.addExecuteTimeNanos(nanos); } public static Map<ProfileEntryKey, ProfileEntryReqStat> getStatsMap() { return statsMapLocal.get(); } public static void initLocal() { statsMapLocal.set(new LinkedHashMap<ProfileEntryKey, ProfileEntryReqStat>()); } public static void removeLocal() { statsMapLocal.remove(); } }