1 #!/usr/sbin/dtrace -Zs 2 /* 3 * rb_stat.d - Ruby operation stats using DTrace. 4 * Written for the Ruby DTrace provider. 5 * 6 * $Id: rb_stat.d,v 1.1.1.1 2015/09/30 22:01:07 christos Exp $ 7 * 8 * This traces activity from all Ruby programs on the system that are 9 * running with Ruby provider support. 10 * 11 * USAGE: rb_stat.d [interval [count]] 12 * 13 * FIELDS: 14 * EXEC/s Ruby programs executed per second, including 15 * those without Ruby provider support 16 * METHOD/s Methods called, per second 17 * OBJNEW/s Objects created, per second 18 * OBJFRE/s Objects freed, per second 19 * RAIS/s Raises, per second 20 * RESC/s Rescues, per second 21 * GC/s Garbage collects, per second 22 * 23 * The numbers are counts for the interval specified. The default interval 24 * is 1 second. 25 * 26 * If you see a count in "EXECS" but not in the other columns, then your 27 * Ruby software is probably not running with the DTrace Ruby provider. 28 * See Ruby/Readme. 29 * 30 * Filename and method names are printed if available. 31 * 32 * COPYRIGHT: Copyright (c) 2007 Brendan Gregg. 33 * 34 * CDDL HEADER START 35 * 36 * The contents of this file are subject to the terms of the 37 * Common Development and Distribution License, Version 1.0 only 38 * (the "License"). You may not use this file except in compliance 39 * with the License. 40 * 41 * You can obtain a copy of the license at Docs/cddl1.txt 42 * or http://www.opensolaris.org/os/licensing. 43 * See the License for the specific language governing permissions 44 * and limitations under the License. 45 * 46 * CDDL HEADER END 47 * 48 * 09-Sep-2007 Brendan Gregg Created this. 49 */ 50 51 #pragma D option quiet 52 #pragma D option defaultargs 53 54 inline int SCREEN = 21; 55 56 dtrace:::BEGIN 57 { 58 execs = methods = objnew = objfree = gc = raised = rescue = 0; 59 lines = SCREEN + 1; 60 interval = $1 ? $1 : 1; 61 counts = $2 ? $2 : -1; 62 secs = interval; 63 first = 1; 64 } 65 66 profile:::tick-1sec 67 { 68 secs--; 69 } 70 71 /* 72 * Print Header 73 */ 74 dtrace:::BEGIN, 75 profile:::tick-1sec 76 /first || (secs == 0 && lines > SCREEN)/ 77 { 78 printf("%-20s %8s %8s %8s %8s %6s %6s %6s\n", "TIME", "EXEC/s", 79 "METHOD/s", "OBJNEW/s", "OBJFRE/s", "RAIS/s", "RESC/s", "GC/s"); 80 lines = 0; 81 first = 0; 82 } 83 84 /* 85 * Tally Data 86 */ 87 proc:::exec-success 88 /execname == "ruby"/ 89 { 90 execs++; 91 } 92 93 ruby*:::function-entry 94 { 95 methods++; 96 } 97 98 ruby*:::object-create-start 99 { 100 objnew++; 101 } 102 103 ruby*:::object-free 104 { 105 objfree++; 106 } 107 108 ruby*:::raise 109 { 110 raised++; 111 } 112 113 ruby*:::rescue 114 { 115 rescue++; 116 } 117 118 ruby*:::gc-begin 119 { 120 gc++; 121 } 122 123 /* 124 * Print Output 125 */ 126 profile:::tick-1sec 127 /secs == 0/ 128 { 129 printf("%-20Y %8d %8d %8d %8d %6d %6d %6d\n", walltimestamp, 130 execs / interval, methods / interval, objnew / interval, 131 objfree / interval, raised / interval, rescue / interval, 132 gc / interval); 133 execs = methods = objnew = objfree = gc = raised = rescue = 0; 134 secs = interval; 135 lines++; 136 counts--; 137 } 138 139 /* 140 * End 141 */ 142 profile:::tick-1sec 143 /counts == 0/ 144 { 145 exit(0); 146 } 147