8222000: JFR: Process start event
Reviewed-by: mgronlun, rriggs
This commit is contained in:
parent
123ac07064
commit
672992f6ac
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2003, 2017, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2003, 2020, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -34,6 +34,8 @@ import java.util.Arrays;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.StringJoiner;
|
||||
import jdk.internal.event.ProcessStartEvent;
|
||||
import sun.security.action.GetPropertyAction;
|
||||
|
||||
/**
|
||||
@ -1104,11 +1106,23 @@ public final class ProcessBuilder
|
||||
}
|
||||
|
||||
try {
|
||||
return ProcessImpl.start(cmdarray,
|
||||
Process process = ProcessImpl.start(cmdarray,
|
||||
environment,
|
||||
dir,
|
||||
redirects,
|
||||
redirectErrorStream);
|
||||
ProcessStartEvent event = new ProcessStartEvent();
|
||||
if (event.isEnabled()) {
|
||||
StringJoiner command = new StringJoiner(" ");
|
||||
for (String s: cmdarray) {
|
||||
command.add(s);
|
||||
}
|
||||
event.directory = dir;
|
||||
event.command = command.toString();
|
||||
event.pid = process.pid();
|
||||
event.commit();
|
||||
}
|
||||
return process;
|
||||
} catch (IOException | IllegalArgumentException e) {
|
||||
String exceptionInfo = ": " + e.getMessage();
|
||||
Throwable cause = e;
|
||||
|
@ -0,0 +1,36 @@
|
||||
/*
|
||||
* Copyright (c) 2020, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation. Oracle designates this
|
||||
* particular file as subject to the "Classpath" exception as provided
|
||||
* by Oracle in the LICENSE file that accompanied this code.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*/
|
||||
|
||||
package jdk.internal.event;
|
||||
|
||||
/**
|
||||
* Event for the start of an OS procsss
|
||||
*/
|
||||
|
||||
public final class ProcessStartEvent extends Event {
|
||||
public long pid;
|
||||
public String directory;
|
||||
public String command;
|
||||
}
|
@ -0,0 +1,48 @@
|
||||
/*
|
||||
* Copyright (c) 2020, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation. Oracle designates this
|
||||
* particular file as subject to the "Classpath" exception as provided
|
||||
* by Oracle in the LICENSE file that accompanied this code.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*/
|
||||
|
||||
package jdk.jfr.events;
|
||||
|
||||
import jdk.jfr.Category;
|
||||
import jdk.jfr.Description;
|
||||
import jdk.jfr.Label;
|
||||
import jdk.jfr.Name;
|
||||
import jdk.jfr.internal.MirrorEvent;
|
||||
|
||||
@Category({"Operating System"})
|
||||
@Label("Process Start")
|
||||
@Name("jdk.ProcessStart")
|
||||
@Description("Operating system process started")
|
||||
@MirrorEvent(className = "jdk.internal.event.ProcessStartEvent")
|
||||
public final class ProcessStartEvent extends AbstractJDKEvent {
|
||||
@Label("Process Id")
|
||||
public long pid;
|
||||
|
||||
@Label("Directory")
|
||||
public String directory;
|
||||
|
||||
@Label("Command")
|
||||
public String command;
|
||||
}
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2016, 2019, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2016, 2020, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -37,6 +37,7 @@ import jdk.jfr.events.ExceptionThrownEvent;
|
||||
import jdk.jfr.events.FileForceEvent;
|
||||
import jdk.jfr.events.FileReadEvent;
|
||||
import jdk.jfr.events.FileWriteEvent;
|
||||
import jdk.jfr.events.ProcessStartEvent;
|
||||
import jdk.jfr.events.SecurityPropertyModificationEvent;
|
||||
import jdk.jfr.events.SocketReadEvent;
|
||||
import jdk.jfr.events.SocketWriteEvent;
|
||||
@ -56,7 +57,8 @@ public final class JDKEvents {
|
||||
SecurityPropertyModificationEvent.class,
|
||||
TLSHandshakeEvent.class,
|
||||
X509CertificateEvent.class,
|
||||
X509ValidationEvent.class
|
||||
X509ValidationEvent.class,
|
||||
ProcessStartEvent.class
|
||||
};
|
||||
|
||||
private static final Class<?>[] eventClasses = {
|
||||
@ -73,7 +75,8 @@ public final class JDKEvents {
|
||||
jdk.internal.event.SecurityPropertyModificationEvent.class,
|
||||
jdk.internal.event.TLSHandshakeEvent.class,
|
||||
jdk.internal.event.X509CertificateEvent.class,
|
||||
jdk.internal.event.X509ValidationEvent.class
|
||||
jdk.internal.event.X509ValidationEvent.class,
|
||||
jdk.internal.event.ProcessStartEvent.class
|
||||
};
|
||||
|
||||
// This is a list of the classes with instrumentation code that should be applied.
|
||||
|
@ -574,6 +574,11 @@
|
||||
<setting name="period">endChunk</setting>
|
||||
</event>
|
||||
|
||||
<event name="jdk.ProcessStart">
|
||||
<setting name="enabled">true</setting>
|
||||
<setting name="stackTrace">true</setting>
|
||||
</event>
|
||||
|
||||
<event name="jdk.NetworkUtilization">
|
||||
<setting name="enabled">true</setting>
|
||||
<setting name="period">5 s</setting>
|
||||
|
@ -573,6 +573,11 @@
|
||||
<setting name="enabled">true</setting>
|
||||
<setting name="period">endChunk</setting>
|
||||
</event>
|
||||
|
||||
<event name="jdk.ProcessStart">
|
||||
<setting name="enabled">true</setting>
|
||||
<setting name="stackTrace">true</setting>
|
||||
</event>
|
||||
|
||||
<event name="jdk.NetworkUtilization">
|
||||
<setting name="enabled">true</setting>
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2018, 2020, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -177,6 +177,8 @@ public class TestDefaultConfigurations {
|
||||
insertSetting(doc, EventNames.TLSHandshake, "threshold", "0 ns");
|
||||
insertSetting(doc, EventNames.X509Certificate, "threshold", "0 ns");
|
||||
insertSetting(doc, EventNames.X509Validation, "threshold", "0 ns");
|
||||
insertSetting(doc, EventNames.ProcessStart, "threshold", "0 ns");
|
||||
|
||||
return doc;
|
||||
}
|
||||
|
||||
|
85
test/jdk/jdk/jfr/event/os/TestProcessStart.java
Normal file
85
test/jdk/jdk/jfr/event/os/TestProcessStart.java
Normal file
@ -0,0 +1,85 @@
|
||||
/*
|
||||
* Copyright (c) 2020, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation. Oracle designates this
|
||||
* particular file as subject to the "Classpath" exception as provided
|
||||
* by Oracle in the LICENSE file that accompanied this code.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*/
|
||||
|
||||
package jdk.jfr.event.os;
|
||||
|
||||
import java.io.File;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.StringJoiner;
|
||||
|
||||
import jdk.jfr.EventType;
|
||||
import jdk.jfr.FlightRecorder;
|
||||
import jdk.jfr.Recording;
|
||||
import jdk.jfr.consumer.RecordedEvent;
|
||||
import jdk.test.lib.Platform;
|
||||
import jdk.test.lib.jfr.EventNames;
|
||||
import jdk.test.lib.jfr.Events;
|
||||
import jdk.test.lib.process.ProcessTools;
|
||||
|
||||
/**
|
||||
* @test
|
||||
* @key jfr
|
||||
* @requires vm.hasJFR
|
||||
* @library /test/lib
|
||||
* @run main/othervm jdk.jfr.event.os.TestProcessStart
|
||||
*/
|
||||
public class TestProcessStart {
|
||||
private final static String EVENT_NAME = EventNames.ProcessStart;
|
||||
|
||||
public static void main(String[] args) throws Throwable {
|
||||
|
||||
try (Recording recording = new Recording()) {
|
||||
recording.enable(EVENT_NAME);
|
||||
recording.start();
|
||||
List<String> commandList = new ArrayList<>();
|
||||
if (Platform.isWindows()) {
|
||||
commandList.add("dir");
|
||||
} else {
|
||||
commandList.add("ls");
|
||||
}
|
||||
commandList.add("*.jfr");
|
||||
ProcessBuilder pb = new ProcessBuilder(commandList);
|
||||
pb.directory(new File(".").getAbsoluteFile());
|
||||
Process p = pb.start();
|
||||
StringJoiner command = new StringJoiner(" ");
|
||||
for (String cmd : commandList) {
|
||||
command.add(cmd);
|
||||
}
|
||||
System.out.println(p.pid());
|
||||
System.out.println(pb.directory());
|
||||
System.out.println(commandList);
|
||||
recording.stop();
|
||||
List<RecordedEvent> events = Events.fromRecording(recording);
|
||||
Events.hasEvents(events);
|
||||
for (RecordedEvent event : events) {
|
||||
System.out.println(event);
|
||||
Events.assertField(event, "pid").equal(p.pid());
|
||||
Events.assertField(event, "directory").equal(pb.directory().toString());
|
||||
Events.assertField(event, "command").equal(command.toString());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2017, 2018, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2017, 2020, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -205,6 +205,7 @@ public final class TestActiveSettingEvent {
|
||||
settingValues.put(EventNames.TLSHandshake + "#threshold", "0 ns");
|
||||
settingValues.put(EventNames.X509Certificate + "#threshold", "0 ns");
|
||||
settingValues.put(EventNames.X509Validation + "#threshold", "0 ns");
|
||||
settingValues.put(EventNames.ProcessStart + "#threshold", "0 ns");
|
||||
|
||||
try (Recording recording = new Recording(c)) {
|
||||
Map<Long, EventType> eventTypes = new HashMap<>();
|
||||
|
@ -171,6 +171,7 @@ public class EventNames {
|
||||
public final static String NativeLibrary = PREFIX + "NativeLibrary";
|
||||
public final static String PhysicalMemory = PREFIX + "PhysicalMemory";
|
||||
public final static String NetworkUtilization = PREFIX + "NetworkUtilization";
|
||||
public static final String ProcessStart = PREFIX + "ProcessStart";
|
||||
|
||||
// JDK
|
||||
public static final String FileForce = PREFIX + "FileForce";
|
||||
|
Loading…
x
Reference in New Issue
Block a user