1 /*
2 * Licensed to the Apache Software Foundation (ASF) under one
3 * or more contributor license agreements. See the NOTICE file
4 * distributed with this work for additional information
5 * regarding copyright ownership. The ASF licenses this file
6 * to you under the Apache License, Version 2.0 (the
7 * "License"); you may not use this file except in compliance
8 * with the License. You may obtain a copy of the License at
9 *
10 * http://www.apache.org/licenses/LICENSE-2.0
11 *
12 * Unless required by applicable law or agreed to in writing, software
13 * distributed under the License is distributed on an "AS IS" BASIS,
14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 * See the License for the specific language governing permissions and
16 * limitations under the License.
17 */
18
19 package org.apache.giraph.utils;
20
21 import org.apache.log4j.Logger;
22
23 import com.yourkit.api.Controller;
24 import com.yourkit.api.ProfilingModes;
25
26 /**
27 * Helper for YourKit profiling from within the code.
28 *
29 * See the following for information about usage:
30 * - http://www.yourkit.com/docs/95/help/api.jsp
31 * - http://www.yourkit.com/docs/95/api/index.html
32 *
33 * This class is a simple helper around the API mentioned above
34 * followed by any amount of snapshotX calls and finally
35 * {@link YourKitContext#stop()}.
36 * See also {@link YourKitContext}.
37 *
38 * As of 05/2013 YourKit is not publishing their API jars to Maven, but their
39 * license allows us to do it, so we have setup a repository to do this.
40 * See https://github.com/facebook/sonatype-yourkit for more info.
41 */
42 public class YourKitProfiler {
43 /** Logger */
44 private static final Logger LOG = Logger.getLogger(YourKitProfiler.class);
45 /** Record every ALLOCATION_RECORDING_INTERVAL'th allocation */
46 private static final int ALLOCATION_RECORDING_INTERVAL = 1000;
47
48 /** Don't construct, allow inheritance */
49 protected YourKitProfiler() { }
50
51 /**
52 * Create a YourKit controller and do some or all of
53 * {@link Controller#enableExceptionTelemetry()}
54 * {@link Controller#startCPUProfiling(long, String, String)}
55 * {@link Controller#startAllocationRecording(boolean, int, boolean,
56 * int, boolean, boolean)}
57 * based on boolean config options passed as method parameters
58 *
59 * @param enableStackTelemetry enable stack telementry
60 * @param enableCPUProfilling enable CPU profilling
61 * @param enableAllocationRecording enable allocation recording
62 *
63 * @return profiler context, or null if controller cannot be created
64 */
65 public static YourKitContext startProfile(boolean enableStackTelemetry,
66 boolean enableCPUProfilling,
67 boolean enableAllocationRecording) {
68 Controller controller;
69 try {
70 controller = new Controller();
71 // CHECKSTYLE: stop IllegalCatch
72 } catch (Exception e) {
73 // CHECKSTYLE: resume IllegalCatch
74 LOG.info("Failed to set up YourKit controller", e);
75 return null;
76 }
77
78 try {
79 if (enableStackTelemetry) {
80 controller.enableStackTelemetry();
81 LOG.info("Enabled Yourkit stack telemetry");
82 }
83 // CHECKSTYLE: stop IllegalCatch
84 } catch (Exception e) {
85 // CHECKSTYLE: resume IllegalCatch
86 LOG.info("Failed to enable YourKit stack telemetry", e);
87 }
88
89 try {
90 if (enableCPUProfilling) {
91 controller.startCPUProfiling(ProfilingModes.CPU_SAMPLING,
92 Controller.DEFAULT_FILTERS, Controller.DEFAULT_WALLTIME_SPEC);
93 LOG.info("Started YourKit CPU profiling");
94 }
95 // CHECKSTYLE: stop IllegalCatch
96 } catch (Exception e) {
97 // CHECKSTYLE: resume IllegalCatch
98 LOG.info("Failed to start YourKit CPU profiling", e);
99 }
100
101 try {
102 if (enableAllocationRecording) {
103 controller.startAllocationRecording(true, ALLOCATION_RECORDING_INTERVAL,
104 false, -1, true, false);
105 LOG.info("Started YourKit allocation recording");
106 }
107 // CHECKSTYLE: stop IllegalCatch
108 } catch (Exception e) {
109 // CHECKSTYLE: resume IllegalCatch
110 LOG.info("Failed to start YourKit allocation recording", e);
111 }
112
113 return new YourKitContext(controller);
114 }
115 }