src/jdk.management.agent/share/classes/jdk/internal/agent/Agent.java
author hb
Fri, 19 Jan 2018 13:46:27 +0530
branchjmx-rest-api
changeset 56026 bd531f08d7c7
parent 56003 4f7f76f6be2f
permissions -rw-r--r--
1. Removed all changes to Java SE APIs 2. Changed module name to jdk.management.rest 3. Rest Adapter invoked via Module service provider 4. changed package name to jdk.internal.management.remote.rest 5. rest module and httpserver module part of platform modules
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
     1
/*
43538
jwilhelm
parents: 43494
diff changeset
     2
 * Copyright (c) 2003, 2017, Oracle and/or its affiliates. All rights reserved.
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
90ce3da70b43 Initial load
duke
parents:
diff changeset
     4
 *
90ce3da70b43 Initial load
duke
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
90ce3da70b43 Initial load
duke
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
5506
202f599c92aa 6943119: Rebrand source copyright notices
ohair
parents: 2285
diff changeset
     7
 * published by the Free Software Foundation.  Oracle designates this
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
     8
 * particular file as subject to the "Classpath" exception as provided
5506
202f599c92aa 6943119: Rebrand source copyright notices
ohair
parents: 2285
diff changeset
     9
 * by Oracle in the LICENSE file that accompanied this code.
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
    10
 *
90ce3da70b43 Initial load
duke
parents:
diff changeset
    11
 * This code is distributed in the hope that it will be useful, but WITHOUT
90ce3da70b43 Initial load
duke
parents:
diff changeset
    12
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
90ce3da70b43 Initial load
duke
parents:
diff changeset
    13
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
90ce3da70b43 Initial load
duke
parents:
diff changeset
    14
 * version 2 for more details (a copy is included in the LICENSE file that
90ce3da70b43 Initial load
duke
parents:
diff changeset
    15
 * accompanied this code).
90ce3da70b43 Initial load
duke
parents:
diff changeset
    16
 *
90ce3da70b43 Initial load
duke
parents:
diff changeset
    17
 * You should have received a copy of the GNU General Public License version
90ce3da70b43 Initial load
duke
parents:
diff changeset
    18
 * 2 along with this work; if not, write to the Free Software Foundation,
90ce3da70b43 Initial load
duke
parents:
diff changeset
    19
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
90ce3da70b43 Initial load
duke
parents:
diff changeset
    20
 *
5506
202f599c92aa 6943119: Rebrand source copyright notices
ohair
parents: 2285
diff changeset
    21
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
202f599c92aa 6943119: Rebrand source copyright notices
ohair
parents: 2285
diff changeset
    22
 * or visit www.oracle.com if you need additional information or have any
202f599c92aa 6943119: Rebrand source copyright notices
ohair
parents: 2285
diff changeset
    23
 * questions.
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
    24
 */
43494
11801b2ff456 8173608: Separate JDK management agent from java.management module
mchung
parents: 40743
diff changeset
    25
package jdk.internal.agent;
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
    26
55985
0c5a02edfdef REST Adapter Initial commit
hb
parents: 47216
diff changeset
    27
import jdk.internal.agent.spi.AgentProvider;
0c5a02edfdef REST Adapter Initial commit
hb
parents: 47216
diff changeset
    28
import jdk.internal.vm.VMSupport;
0c5a02edfdef REST Adapter Initial commit
hb
parents: 47216
diff changeset
    29
import sun.management.jdp.JdpController;
0c5a02edfdef REST Adapter Initial commit
hb
parents: 47216
diff changeset
    30
import sun.management.jdp.JdpException;
0c5a02edfdef REST Adapter Initial commit
hb
parents: 47216
diff changeset
    31
import sun.management.jmxremote.ConnectorBootstrap;
0c5a02edfdef REST Adapter Initial commit
hb
parents: 47216
diff changeset
    32
0c5a02edfdef REST Adapter Initial commit
hb
parents: 47216
diff changeset
    33
import javax.management.remote.JMXConnectorServer;
0c5a02edfdef REST Adapter Initial commit
hb
parents: 47216
diff changeset
    34
import javax.management.remote.JMXServiceURL;
0c5a02edfdef REST Adapter Initial commit
hb
parents: 47216
diff changeset
    35
import java.io.*;
15531
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents: 12694
diff changeset
    36
import java.lang.management.ManagementFactory;
11991
800d0ff7b043 7110104: It should be possible to stop and start JMX Agent at runtime
dsamersoff
parents: 11530
diff changeset
    37
import java.lang.reflect.Method;
15531
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents: 12694
diff changeset
    38
import java.net.InetAddress;
30334
22a5f09f4da9 8023093: Add ManagementAgent.status diagnostic command
jbachorik
parents: 27957
diff changeset
    39
import java.net.MalformedURLException;
15531
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents: 12694
diff changeset
    40
import java.net.UnknownHostException;
40743
a775e4de954f 8131061: Use of -Dcom.sun.management.snmp needs to be examined for modules
vtewari
parents: 36854
diff changeset
    41
import java.security.AccessController;
a775e4de954f 8131061: Use of -Dcom.sun.management.snmp needs to be examined for modules
vtewari
parents: 36854
diff changeset
    42
import java.security.PrivilegedAction;
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
    43
import java.text.MessageFormat;
55985
0c5a02edfdef REST Adapter Initial commit
hb
parents: 47216
diff changeset
    44
import java.util.*;
34540
83f41bd1c3c8 8142398: ManagementAgent.status diagnostic command only outputs the specifically set properties
jbachorik
parents: 33267
diff changeset
    45
import java.util.function.Function;
83f41bd1c3c8 8142398: ManagementAgent.status diagnostic command only outputs the specifically set properties
jbachorik
parents: 33267
diff changeset
    46
import java.util.function.Predicate;
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
    47
43494
11801b2ff456 8173608: Separate JDK management agent from java.management module
mchung
parents: 40743
diff changeset
    48
import static jdk.internal.agent.AgentConfigurationError.*;
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
    49
90ce3da70b43 Initial load
duke
parents:
diff changeset
    50
/**
15531
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents: 12694
diff changeset
    51
 * This Agent is started by the VM when -Dcom.sun.management.snmp or
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents: 12694
diff changeset
    52
 * -Dcom.sun.management.jmxremote is set. This class will be loaded by the
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents: 12694
diff changeset
    53
 * system class loader. Also jmx framework could be started by jcmd
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
    54
 */
90ce3da70b43 Initial load
duke
parents:
diff changeset
    55
public class Agent {
30334
22a5f09f4da9 8023093: Add ManagementAgent.status diagnostic command
jbachorik
parents: 27957
diff changeset
    56
    /**
22a5f09f4da9 8023093: Add ManagementAgent.status diagnostic command
jbachorik
parents: 27957
diff changeset
    57
     * Agent status collector strategy class
22a5f09f4da9 8023093: Add ManagementAgent.status diagnostic command
jbachorik
parents: 27957
diff changeset
    58
     */
22a5f09f4da9 8023093: Add ManagementAgent.status diagnostic command
jbachorik
parents: 27957
diff changeset
    59
    private static abstract class StatusCollector {
34540
83f41bd1c3c8 8142398: ManagementAgent.status diagnostic command only outputs the specifically set properties
jbachorik
parents: 33267
diff changeset
    60
        protected static final Map<String, String> DEFAULT_PROPS = new HashMap<>();
83f41bd1c3c8 8142398: ManagementAgent.status diagnostic command only outputs the specifically set properties
jbachorik
parents: 33267
diff changeset
    61
83f41bd1c3c8 8142398: ManagementAgent.status diagnostic command only outputs the specifically set properties
jbachorik
parents: 33267
diff changeset
    62
        static {
83f41bd1c3c8 8142398: ManagementAgent.status diagnostic command only outputs the specifically set properties
jbachorik
parents: 33267
diff changeset
    63
            DEFAULT_PROPS.put(ConnectorBootstrap.PropertyNames.PORT,
83f41bd1c3c8 8142398: ManagementAgent.status diagnostic command only outputs the specifically set properties
jbachorik
parents: 33267
diff changeset
    64
                              ConnectorBootstrap.DefaultValues.PORT);
83f41bd1c3c8 8142398: ManagementAgent.status diagnostic command only outputs the specifically set properties
jbachorik
parents: 33267
diff changeset
    65
            DEFAULT_PROPS.put(ConnectorBootstrap.PropertyNames.USE_LOCAL_ONLY,
83f41bd1c3c8 8142398: ManagementAgent.status diagnostic command only outputs the specifically set properties
jbachorik
parents: 33267
diff changeset
    66
                              ConnectorBootstrap.DefaultValues.USE_LOCAL_ONLY);
83f41bd1c3c8 8142398: ManagementAgent.status diagnostic command only outputs the specifically set properties
jbachorik
parents: 33267
diff changeset
    67
            DEFAULT_PROPS.put(ConnectorBootstrap.PropertyNames.USE_AUTHENTICATION,
83f41bd1c3c8 8142398: ManagementAgent.status diagnostic command only outputs the specifically set properties
jbachorik
parents: 33267
diff changeset
    68
                              ConnectorBootstrap.DefaultValues.USE_AUTHENTICATION);
83f41bd1c3c8 8142398: ManagementAgent.status diagnostic command only outputs the specifically set properties
jbachorik
parents: 33267
diff changeset
    69
            DEFAULT_PROPS.put(ConnectorBootstrap.PropertyNames.USE_SSL,
83f41bd1c3c8 8142398: ManagementAgent.status diagnostic command only outputs the specifically set properties
jbachorik
parents: 33267
diff changeset
    70
                              ConnectorBootstrap.DefaultValues.USE_SSL);
83f41bd1c3c8 8142398: ManagementAgent.status diagnostic command only outputs the specifically set properties
jbachorik
parents: 33267
diff changeset
    71
            DEFAULT_PROPS.put(ConnectorBootstrap.PropertyNames.USE_REGISTRY_SSL,
83f41bd1c3c8 8142398: ManagementAgent.status diagnostic command only outputs the specifically set properties
jbachorik
parents: 33267
diff changeset
    72
                              ConnectorBootstrap.DefaultValues.USE_REGISTRY_SSL);
83f41bd1c3c8 8142398: ManagementAgent.status diagnostic command only outputs the specifically set properties
jbachorik
parents: 33267
diff changeset
    73
            DEFAULT_PROPS.put(ConnectorBootstrap.PropertyNames.SSL_NEED_CLIENT_AUTH,
83f41bd1c3c8 8142398: ManagementAgent.status diagnostic command only outputs the specifically set properties
jbachorik
parents: 33267
diff changeset
    74
                              ConnectorBootstrap.DefaultValues.SSL_NEED_CLIENT_AUTH);
83f41bd1c3c8 8142398: ManagementAgent.status diagnostic command only outputs the specifically set properties
jbachorik
parents: 33267
diff changeset
    75
            DEFAULT_PROPS.put(ConnectorBootstrap.PropertyNames.CONFIG_FILE_NAME,
83f41bd1c3c8 8142398: ManagementAgent.status diagnostic command only outputs the specifically set properties
jbachorik
parents: 33267
diff changeset
    76
                              ConnectorBootstrap.DefaultValues.CONFIG_FILE_NAME);
83f41bd1c3c8 8142398: ManagementAgent.status diagnostic command only outputs the specifically set properties
jbachorik
parents: 33267
diff changeset
    77
            DEFAULT_PROPS.put(ConnectorBootstrap.PropertyNames.PASSWORD_FILE_NAME,
83f41bd1c3c8 8142398: ManagementAgent.status diagnostic command only outputs the specifically set properties
jbachorik
parents: 33267
diff changeset
    78
                              ConnectorBootstrap.DefaultValues.PASSWORD_FILE_NAME);
83f41bd1c3c8 8142398: ManagementAgent.status diagnostic command only outputs the specifically set properties
jbachorik
parents: 33267
diff changeset
    79
            DEFAULT_PROPS.put(ConnectorBootstrap.PropertyNames.ACCESS_FILE_NAME,
83f41bd1c3c8 8142398: ManagementAgent.status diagnostic command only outputs the specifically set properties
jbachorik
parents: 33267
diff changeset
    80
                              ConnectorBootstrap.DefaultValues.ACCESS_FILE_NAME);
83f41bd1c3c8 8142398: ManagementAgent.status diagnostic command only outputs the specifically set properties
jbachorik
parents: 33267
diff changeset
    81
83f41bd1c3c8 8142398: ManagementAgent.status diagnostic command only outputs the specifically set properties
jbachorik
parents: 33267
diff changeset
    82
        }
83f41bd1c3c8 8142398: ManagementAgent.status diagnostic command only outputs the specifically set properties
jbachorik
parents: 33267
diff changeset
    83
30334
22a5f09f4da9 8023093: Add ManagementAgent.status diagnostic command
jbachorik
parents: 27957
diff changeset
    84
        final protected StringBuilder sb = new StringBuilder();
22a5f09f4da9 8023093: Add ManagementAgent.status diagnostic command
jbachorik
parents: 27957
diff changeset
    85
        final public String collect() {
22a5f09f4da9 8023093: Add ManagementAgent.status diagnostic command
jbachorik
parents: 27957
diff changeset
    86
            Properties agentProps = VMSupport.getAgentProperties();
22a5f09f4da9 8023093: Add ManagementAgent.status diagnostic command
jbachorik
parents: 27957
diff changeset
    87
            String localConnAddr = (String)agentProps.get(LOCAL_CONNECTOR_ADDRESS_PROP);
22a5f09f4da9 8023093: Add ManagementAgent.status diagnostic command
jbachorik
parents: 27957
diff changeset
    88
            if (localConnAddr != null || jmxServer != null) {
22a5f09f4da9 8023093: Add ManagementAgent.status diagnostic command
jbachorik
parents: 27957
diff changeset
    89
                addAgentStatus(true);
22a5f09f4da9 8023093: Add ManagementAgent.status diagnostic command
jbachorik
parents: 27957
diff changeset
    90
                appendConnections(localConnAddr);
22a5f09f4da9 8023093: Add ManagementAgent.status diagnostic command
jbachorik
parents: 27957
diff changeset
    91
            } else {
22a5f09f4da9 8023093: Add ManagementAgent.status diagnostic command
jbachorik
parents: 27957
diff changeset
    92
                addAgentStatus(false);
22a5f09f4da9 8023093: Add ManagementAgent.status diagnostic command
jbachorik
parents: 27957
diff changeset
    93
            }
22a5f09f4da9 8023093: Add ManagementAgent.status diagnostic command
jbachorik
parents: 27957
diff changeset
    94
            return sb.toString();
22a5f09f4da9 8023093: Add ManagementAgent.status diagnostic command
jbachorik
parents: 27957
diff changeset
    95
        }
22a5f09f4da9 8023093: Add ManagementAgent.status diagnostic command
jbachorik
parents: 27957
diff changeset
    96
22a5f09f4da9 8023093: Add ManagementAgent.status diagnostic command
jbachorik
parents: 27957
diff changeset
    97
        private void appendConnections(String localConnAddr) {
22a5f09f4da9 8023093: Add ManagementAgent.status diagnostic command
jbachorik
parents: 27957
diff changeset
    98
            appendConnectionsHeader();
22a5f09f4da9 8023093: Add ManagementAgent.status diagnostic command
jbachorik
parents: 27957
diff changeset
    99
            if (localConnAddr != null) {
22a5f09f4da9 8023093: Add ManagementAgent.status diagnostic command
jbachorik
parents: 27957
diff changeset
   100
                try {
22a5f09f4da9 8023093: Add ManagementAgent.status diagnostic command
jbachorik
parents: 27957
diff changeset
   101
                    JMXServiceURL u = new JMXServiceURL(localConnAddr);
22a5f09f4da9 8023093: Add ManagementAgent.status diagnostic command
jbachorik
parents: 27957
diff changeset
   102
                    addConnection(false, u);
22a5f09f4da9 8023093: Add ManagementAgent.status diagnostic command
jbachorik
parents: 27957
diff changeset
   103
                } catch (MalformedURLException e) {
22a5f09f4da9 8023093: Add ManagementAgent.status diagnostic command
jbachorik
parents: 27957
diff changeset
   104
                    // will never happen
22a5f09f4da9 8023093: Add ManagementAgent.status diagnostic command
jbachorik
parents: 27957
diff changeset
   105
                }
22a5f09f4da9 8023093: Add ManagementAgent.status diagnostic command
jbachorik
parents: 27957
diff changeset
   106
22a5f09f4da9 8023093: Add ManagementAgent.status diagnostic command
jbachorik
parents: 27957
diff changeset
   107
            }
22a5f09f4da9 8023093: Add ManagementAgent.status diagnostic command
jbachorik
parents: 27957
diff changeset
   108
            if (jmxServer != null) {
22a5f09f4da9 8023093: Add ManagementAgent.status diagnostic command
jbachorik
parents: 27957
diff changeset
   109
                addConnection(true, jmxServer.getAddress());
22a5f09f4da9 8023093: Add ManagementAgent.status diagnostic command
jbachorik
parents: 27957
diff changeset
   110
            }
22a5f09f4da9 8023093: Add ManagementAgent.status diagnostic command
jbachorik
parents: 27957
diff changeset
   111
            appendConnectionsFooter();
22a5f09f4da9 8023093: Add ManagementAgent.status diagnostic command
jbachorik
parents: 27957
diff changeset
   112
        }
22a5f09f4da9 8023093: Add ManagementAgent.status diagnostic command
jbachorik
parents: 27957
diff changeset
   113
22a5f09f4da9 8023093: Add ManagementAgent.status diagnostic command
jbachorik
parents: 27957
diff changeset
   114
        private void addConnection(boolean remote, JMXServiceURL u) {
22a5f09f4da9 8023093: Add ManagementAgent.status diagnostic command
jbachorik
parents: 27957
diff changeset
   115
            appendConnectionHeader(remote);
22a5f09f4da9 8023093: Add ManagementAgent.status diagnostic command
jbachorik
parents: 27957
diff changeset
   116
            addConnectionDetails(u);
34540
83f41bd1c3c8 8142398: ManagementAgent.status diagnostic command only outputs the specifically set properties
jbachorik
parents: 33267
diff changeset
   117
            addConfigProperties();
30334
22a5f09f4da9 8023093: Add ManagementAgent.status diagnostic command
jbachorik
parents: 27957
diff changeset
   118
            appendConnectionFooter(remote);
22a5f09f4da9 8023093: Add ManagementAgent.status diagnostic command
jbachorik
parents: 27957
diff changeset
   119
        }
22a5f09f4da9 8023093: Add ManagementAgent.status diagnostic command
jbachorik
parents: 27957
diff changeset
   120
22a5f09f4da9 8023093: Add ManagementAgent.status diagnostic command
jbachorik
parents: 27957
diff changeset
   121
        private void addConfigProperties() {
22a5f09f4da9 8023093: Add ManagementAgent.status diagnostic command
jbachorik
parents: 27957
diff changeset
   122
            appendConfigPropsHeader();
34540
83f41bd1c3c8 8142398: ManagementAgent.status diagnostic command only outputs the specifically set properties
jbachorik
parents: 33267
diff changeset
   123
83f41bd1c3c8 8142398: ManagementAgent.status diagnostic command only outputs the specifically set properties
jbachorik
parents: 33267
diff changeset
   124
            Properties remoteProps = configProps != null ?
83f41bd1c3c8 8142398: ManagementAgent.status diagnostic command only outputs the specifically set properties
jbachorik
parents: 33267
diff changeset
   125
                                        configProps : getManagementProperties();
83f41bd1c3c8 8142398: ManagementAgent.status diagnostic command only outputs the specifically set properties
jbachorik
parents: 33267
diff changeset
   126
            Map<Object, Object> props = new HashMap<>(DEFAULT_PROPS);
83f41bd1c3c8 8142398: ManagementAgent.status diagnostic command only outputs the specifically set properties
jbachorik
parents: 33267
diff changeset
   127
83f41bd1c3c8 8142398: ManagementAgent.status diagnostic command only outputs the specifically set properties
jbachorik
parents: 33267
diff changeset
   128
            if (remoteProps == null) {
83f41bd1c3c8 8142398: ManagementAgent.status diagnostic command only outputs the specifically set properties
jbachorik
parents: 33267
diff changeset
   129
                // local connector only
83f41bd1c3c8 8142398: ManagementAgent.status diagnostic command only outputs the specifically set properties
jbachorik
parents: 33267
diff changeset
   130
                String loc_only = System.getProperty(
83f41bd1c3c8 8142398: ManagementAgent.status diagnostic command only outputs the specifically set properties
jbachorik
parents: 33267
diff changeset
   131
                    ConnectorBootstrap.PropertyNames.USE_LOCAL_ONLY
83f41bd1c3c8 8142398: ManagementAgent.status diagnostic command only outputs the specifically set properties
jbachorik
parents: 33267
diff changeset
   132
                );
33267
c9211ad104b5 8138748: ManagementAgent.status DCMD fails with NPE for JMX configured on command line
jbachorik
parents: 30803
diff changeset
   133
34540
83f41bd1c3c8 8142398: ManagementAgent.status diagnostic command only outputs the specifically set properties
jbachorik
parents: 33267
diff changeset
   134
                if (loc_only != null &&
83f41bd1c3c8 8142398: ManagementAgent.status diagnostic command only outputs the specifically set properties
jbachorik
parents: 33267
diff changeset
   135
                    !ConnectorBootstrap.DefaultValues.USE_LOCAL_ONLY.equals(loc_only)) {
83f41bd1c3c8 8142398: ManagementAgent.status diagnostic command only outputs the specifically set properties
jbachorik
parents: 33267
diff changeset
   136
                    props.put(
83f41bd1c3c8 8142398: ManagementAgent.status diagnostic command only outputs the specifically set properties
jbachorik
parents: 33267
diff changeset
   137
                        ConnectorBootstrap.PropertyNames.USE_LOCAL_ONLY,
83f41bd1c3c8 8142398: ManagementAgent.status diagnostic command only outputs the specifically set properties
jbachorik
parents: 33267
diff changeset
   138
                        loc_only
83f41bd1c3c8 8142398: ManagementAgent.status diagnostic command only outputs the specifically set properties
jbachorik
parents: 33267
diff changeset
   139
                    );
30334
22a5f09f4da9 8023093: Add ManagementAgent.status diagnostic command
jbachorik
parents: 27957
diff changeset
   140
                }
34540
83f41bd1c3c8 8142398: ManagementAgent.status diagnostic command only outputs the specifically set properties
jbachorik
parents: 33267
diff changeset
   141
            } else {
83f41bd1c3c8 8142398: ManagementAgent.status diagnostic command only outputs the specifically set properties
jbachorik
parents: 33267
diff changeset
   142
                props.putAll(remoteProps);
83f41bd1c3c8 8142398: ManagementAgent.status diagnostic command only outputs the specifically set properties
jbachorik
parents: 33267
diff changeset
   143
            }
83f41bd1c3c8 8142398: ManagementAgent.status diagnostic command only outputs the specifically set properties
jbachorik
parents: 33267
diff changeset
   144
83f41bd1c3c8 8142398: ManagementAgent.status diagnostic command only outputs the specifically set properties
jbachorik
parents: 33267
diff changeset
   145
            props.entrySet().stream()
83f41bd1c3c8 8142398: ManagementAgent.status diagnostic command only outputs the specifically set properties
jbachorik
parents: 33267
diff changeset
   146
                .filter(preprocess(Map.Entry::getKey, StatusCollector::isManagementProp))
83f41bd1c3c8 8142398: ManagementAgent.status diagnostic command only outputs the specifically set properties
jbachorik
parents: 33267
diff changeset
   147
                .forEach(this::addConfigProp);
83f41bd1c3c8 8142398: ManagementAgent.status diagnostic command only outputs the specifically set properties
jbachorik
parents: 33267
diff changeset
   148
30334
22a5f09f4da9 8023093: Add ManagementAgent.status diagnostic command
jbachorik
parents: 27957
diff changeset
   149
            appendConfigPropsFooter();
22a5f09f4da9 8023093: Add ManagementAgent.status diagnostic command
jbachorik
parents: 27957
diff changeset
   150
        }
22a5f09f4da9 8023093: Add ManagementAgent.status diagnostic command
jbachorik
parents: 27957
diff changeset
   151
34540
83f41bd1c3c8 8142398: ManagementAgent.status diagnostic command only outputs the specifically set properties
jbachorik
parents: 33267
diff changeset
   152
        private static boolean isManagementProp(Object pName) {
83f41bd1c3c8 8142398: ManagementAgent.status diagnostic command only outputs the specifically set properties
jbachorik
parents: 33267
diff changeset
   153
            return pName != null && pName.toString().startsWith("com.sun.management.");
83f41bd1c3c8 8142398: ManagementAgent.status diagnostic command only outputs the specifically set properties
jbachorik
parents: 33267
diff changeset
   154
        }
83f41bd1c3c8 8142398: ManagementAgent.status diagnostic command only outputs the specifically set properties
jbachorik
parents: 33267
diff changeset
   155
83f41bd1c3c8 8142398: ManagementAgent.status diagnostic command only outputs the specifically set properties
jbachorik
parents: 33267
diff changeset
   156
        private static <T, V> Predicate<T> preprocess(Function<T, V> f, Predicate<V> p) {
83f41bd1c3c8 8142398: ManagementAgent.status diagnostic command only outputs the specifically set properties
jbachorik
parents: 33267
diff changeset
   157
            return (T t) -> p.test(f.apply(t));
83f41bd1c3c8 8142398: ManagementAgent.status diagnostic command only outputs the specifically set properties
jbachorik
parents: 33267
diff changeset
   158
        }
83f41bd1c3c8 8142398: ManagementAgent.status diagnostic command only outputs the specifically set properties
jbachorik
parents: 33267
diff changeset
   159
30334
22a5f09f4da9 8023093: Add ManagementAgent.status diagnostic command
jbachorik
parents: 27957
diff changeset
   160
        abstract protected void addAgentStatus(boolean enabled);
22a5f09f4da9 8023093: Add ManagementAgent.status diagnostic command
jbachorik
parents: 27957
diff changeset
   161
        abstract protected void appendConnectionsHeader();
22a5f09f4da9 8023093: Add ManagementAgent.status diagnostic command
jbachorik
parents: 27957
diff changeset
   162
        abstract protected void appendConnectionsFooter();
22a5f09f4da9 8023093: Add ManagementAgent.status diagnostic command
jbachorik
parents: 27957
diff changeset
   163
        abstract protected void addConnectionDetails(JMXServiceURL u);
22a5f09f4da9 8023093: Add ManagementAgent.status diagnostic command
jbachorik
parents: 27957
diff changeset
   164
        abstract protected void appendConnectionHeader(boolean remote);
22a5f09f4da9 8023093: Add ManagementAgent.status diagnostic command
jbachorik
parents: 27957
diff changeset
   165
        abstract protected void appendConnectionFooter(boolean remote);
22a5f09f4da9 8023093: Add ManagementAgent.status diagnostic command
jbachorik
parents: 27957
diff changeset
   166
        abstract protected void appendConfigPropsHeader();
22a5f09f4da9 8023093: Add ManagementAgent.status diagnostic command
jbachorik
parents: 27957
diff changeset
   167
        abstract protected void appendConfigPropsFooter();
34540
83f41bd1c3c8 8142398: ManagementAgent.status diagnostic command only outputs the specifically set properties
jbachorik
parents: 33267
diff changeset
   168
        abstract protected void addConfigProp(Map.Entry<?, ?> prop);
30334
22a5f09f4da9 8023093: Add ManagementAgent.status diagnostic command
jbachorik
parents: 27957
diff changeset
   169
    }
22a5f09f4da9 8023093: Add ManagementAgent.status diagnostic command
jbachorik
parents: 27957
diff changeset
   170
22a5f09f4da9 8023093: Add ManagementAgent.status diagnostic command
jbachorik
parents: 27957
diff changeset
   171
    /**
22a5f09f4da9 8023093: Add ManagementAgent.status diagnostic command
jbachorik
parents: 27957
diff changeset
   172
     * Free-text status collector strategy implementation
22a5f09f4da9 8023093: Add ManagementAgent.status diagnostic command
jbachorik
parents: 27957
diff changeset
   173
     */
22a5f09f4da9 8023093: Add ManagementAgent.status diagnostic command
jbachorik
parents: 27957
diff changeset
   174
    final private static class TextStatusCollector extends StatusCollector {
22a5f09f4da9 8023093: Add ManagementAgent.status diagnostic command
jbachorik
parents: 27957
diff changeset
   175
22a5f09f4da9 8023093: Add ManagementAgent.status diagnostic command
jbachorik
parents: 27957
diff changeset
   176
        @Override
22a5f09f4da9 8023093: Add ManagementAgent.status diagnostic command
jbachorik
parents: 27957
diff changeset
   177
        protected void addAgentStatus(boolean enabled) {
22a5f09f4da9 8023093: Add ManagementAgent.status diagnostic command
jbachorik
parents: 27957
diff changeset
   178
            sb.append("Agent: ").append(enabled ? "enabled" : "disabled").append('\n');
22a5f09f4da9 8023093: Add ManagementAgent.status diagnostic command
jbachorik
parents: 27957
diff changeset
   179
        }
22a5f09f4da9 8023093: Add ManagementAgent.status diagnostic command
jbachorik
parents: 27957
diff changeset
   180
22a5f09f4da9 8023093: Add ManagementAgent.status diagnostic command
jbachorik
parents: 27957
diff changeset
   181
        @Override
22a5f09f4da9 8023093: Add ManagementAgent.status diagnostic command
jbachorik
parents: 27957
diff changeset
   182
        protected void appendConnectionsHeader() {
22a5f09f4da9 8023093: Add ManagementAgent.status diagnostic command
jbachorik
parents: 27957
diff changeset
   183
            sb.append('\n');
22a5f09f4da9 8023093: Add ManagementAgent.status diagnostic command
jbachorik
parents: 27957
diff changeset
   184
        }
22a5f09f4da9 8023093: Add ManagementAgent.status diagnostic command
jbachorik
parents: 27957
diff changeset
   185
22a5f09f4da9 8023093: Add ManagementAgent.status diagnostic command
jbachorik
parents: 27957
diff changeset
   186
        @Override
22a5f09f4da9 8023093: Add ManagementAgent.status diagnostic command
jbachorik
parents: 27957
diff changeset
   187
        protected void addConnectionDetails(JMXServiceURL u) {
22a5f09f4da9 8023093: Add ManagementAgent.status diagnostic command
jbachorik
parents: 27957
diff changeset
   188
            sb.append("Protocol       : ").append(u.getProtocol()).append('\n')
22a5f09f4da9 8023093: Add ManagementAgent.status diagnostic command
jbachorik
parents: 27957
diff changeset
   189
              .append("Host           : ").append(u.getHost()).append('\n')
22a5f09f4da9 8023093: Add ManagementAgent.status diagnostic command
jbachorik
parents: 27957
diff changeset
   190
              .append("URL            : ").append(u).append('\n');
22a5f09f4da9 8023093: Add ManagementAgent.status diagnostic command
jbachorik
parents: 27957
diff changeset
   191
        }
22a5f09f4da9 8023093: Add ManagementAgent.status diagnostic command
jbachorik
parents: 27957
diff changeset
   192
22a5f09f4da9 8023093: Add ManagementAgent.status diagnostic command
jbachorik
parents: 27957
diff changeset
   193
        @Override
22a5f09f4da9 8023093: Add ManagementAgent.status diagnostic command
jbachorik
parents: 27957
diff changeset
   194
        protected void appendConnectionHeader(boolean remote) {
22a5f09f4da9 8023093: Add ManagementAgent.status diagnostic command
jbachorik
parents: 27957
diff changeset
   195
            sb.append("Connection Type: ").append(remote ? "remote" : "local").append('\n');
22a5f09f4da9 8023093: Add ManagementAgent.status diagnostic command
jbachorik
parents: 27957
diff changeset
   196
        }
22a5f09f4da9 8023093: Add ManagementAgent.status diagnostic command
jbachorik
parents: 27957
diff changeset
   197
22a5f09f4da9 8023093: Add ManagementAgent.status diagnostic command
jbachorik
parents: 27957
diff changeset
   198
        @Override
22a5f09f4da9 8023093: Add ManagementAgent.status diagnostic command
jbachorik
parents: 27957
diff changeset
   199
        protected void appendConfigPropsHeader() {
22a5f09f4da9 8023093: Add ManagementAgent.status diagnostic command
jbachorik
parents: 27957
diff changeset
   200
            sb.append("Properties     :\n");
22a5f09f4da9 8023093: Add ManagementAgent.status diagnostic command
jbachorik
parents: 27957
diff changeset
   201
        }
22a5f09f4da9 8023093: Add ManagementAgent.status diagnostic command
jbachorik
parents: 27957
diff changeset
   202
22a5f09f4da9 8023093: Add ManagementAgent.status diagnostic command
jbachorik
parents: 27957
diff changeset
   203
        @Override
34540
83f41bd1c3c8 8142398: ManagementAgent.status diagnostic command only outputs the specifically set properties
jbachorik
parents: 33267
diff changeset
   204
        protected void addConfigProp(Map.Entry<?, ?> prop) {
83f41bd1c3c8 8142398: ManagementAgent.status diagnostic command only outputs the specifically set properties
jbachorik
parents: 33267
diff changeset
   205
            sb.append("  ").append(prop.getKey()).append(" = ")
83f41bd1c3c8 8142398: ManagementAgent.status diagnostic command only outputs the specifically set properties
jbachorik
parents: 33267
diff changeset
   206
              .append(prop.getValue());
83f41bd1c3c8 8142398: ManagementAgent.status diagnostic command only outputs the specifically set properties
jbachorik
parents: 33267
diff changeset
   207
            Object defVal = DEFAULT_PROPS.get(prop.getKey());
83f41bd1c3c8 8142398: ManagementAgent.status diagnostic command only outputs the specifically set properties
jbachorik
parents: 33267
diff changeset
   208
            if (defVal != null && defVal.equals(prop.getValue())) {
83f41bd1c3c8 8142398: ManagementAgent.status diagnostic command only outputs the specifically set properties
jbachorik
parents: 33267
diff changeset
   209
                sb.append(" [default]");
30334
22a5f09f4da9 8023093: Add ManagementAgent.status diagnostic command
jbachorik
parents: 27957
diff changeset
   210
            }
34540
83f41bd1c3c8 8142398: ManagementAgent.status diagnostic command only outputs the specifically set properties
jbachorik
parents: 33267
diff changeset
   211
            sb.append("\n");
30334
22a5f09f4da9 8023093: Add ManagementAgent.status diagnostic command
jbachorik
parents: 27957
diff changeset
   212
        }
22a5f09f4da9 8023093: Add ManagementAgent.status diagnostic command
jbachorik
parents: 27957
diff changeset
   213
22a5f09f4da9 8023093: Add ManagementAgent.status diagnostic command
jbachorik
parents: 27957
diff changeset
   214
        @Override
22a5f09f4da9 8023093: Add ManagementAgent.status diagnostic command
jbachorik
parents: 27957
diff changeset
   215
        protected void appendConnectionsFooter() {}
22a5f09f4da9 8023093: Add ManagementAgent.status diagnostic command
jbachorik
parents: 27957
diff changeset
   216
22a5f09f4da9 8023093: Add ManagementAgent.status diagnostic command
jbachorik
parents: 27957
diff changeset
   217
        @Override
22a5f09f4da9 8023093: Add ManagementAgent.status diagnostic command
jbachorik
parents: 27957
diff changeset
   218
        protected void appendConnectionFooter(boolean remote) {
22a5f09f4da9 8023093: Add ManagementAgent.status diagnostic command
jbachorik
parents: 27957
diff changeset
   219
            sb.append('\n');
22a5f09f4da9 8023093: Add ManagementAgent.status diagnostic command
jbachorik
parents: 27957
diff changeset
   220
        }
22a5f09f4da9 8023093: Add ManagementAgent.status diagnostic command
jbachorik
parents: 27957
diff changeset
   221
22a5f09f4da9 8023093: Add ManagementAgent.status diagnostic command
jbachorik
parents: 27957
diff changeset
   222
        @Override
22a5f09f4da9 8023093: Add ManagementAgent.status diagnostic command
jbachorik
parents: 27957
diff changeset
   223
        protected void appendConfigPropsFooter() {}
22a5f09f4da9 8023093: Add ManagementAgent.status diagnostic command
jbachorik
parents: 27957
diff changeset
   224
    }
22a5f09f4da9 8023093: Add ManagementAgent.status diagnostic command
jbachorik
parents: 27957
diff changeset
   225
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   226
    // management properties
15531
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents: 12694
diff changeset
   227
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   228
    private static Properties mgmtProps;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   229
    private static ResourceBundle messageRB;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   230
    private static final String CONFIG_FILE =
15531
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents: 12694
diff changeset
   231
            "com.sun.management.config.file";
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   232
    private static final String SNMP_PORT =
15531
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents: 12694
diff changeset
   233
            "com.sun.management.snmp.port";
55985
0c5a02edfdef REST Adapter Initial commit
hb
parents: 47216
diff changeset
   234
    private static final String REST_PORT =
0c5a02edfdef REST Adapter Initial commit
hb
parents: 47216
diff changeset
   235
            "com.sun.management.jmxremote.rest.port";
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   236
    private static final String JMXREMOTE =
15531
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents: 12694
diff changeset
   237
            "com.sun.management.jmxremote";
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   238
    private static final String JMXREMOTE_PORT =
15531
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents: 12694
diff changeset
   239
            "com.sun.management.jmxremote.port";
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents: 12694
diff changeset
   240
    private static final String RMI_PORT =
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents: 12694
diff changeset
   241
            "com.sun.management.jmxremote.rmi.port";
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   242
    private static final String ENABLE_THREAD_CONTENTION_MONITORING =
15531
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents: 12694
diff changeset
   243
            "com.sun.management.enableThreadContentionMonitoring";
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   244
    private static final String LOCAL_CONNECTOR_ADDRESS_PROP =
15531
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents: 12694
diff changeset
   245
            "com.sun.management.jmxremote.localConnectorAddress";
40743
a775e4de954f 8131061: Use of -Dcom.sun.management.snmp needs to be examined for modules
vtewari
parents: 36854
diff changeset
   246
    private static final String SNMP_AGENT_NAME =
a775e4de954f 8131061: Use of -Dcom.sun.management.snmp needs to be examined for modules
vtewari
parents: 36854
diff changeset
   247
            "SnmpAgent";
56026
bd531f08d7c7 1. Removed all changes to Java SE APIs
hb
parents: 56003
diff changeset
   248
    private static final String REST_ADAPTER_NAME = "RestAdapter";
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   249
17721
1d6516794d05 8014420: Default JDP address does not match the one assigned by IANA
dsamersoff
parents: 15531
diff changeset
   250
    private static final String JDP_DEFAULT_ADDRESS = "224.0.23.178";
15531
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents: 12694
diff changeset
   251
    private static final int JDP_DEFAULT_PORT = 7095;
11991
800d0ff7b043 7110104: It should be possible to stop and start JMX Agent at runtime
dsamersoff
parents: 11530
diff changeset
   252
800d0ff7b043 7110104: It should be possible to stop and start JMX Agent at runtime
dsamersoff
parents: 11530
diff changeset
   253
    // The only active agent allowed
800d0ff7b043 7110104: It should be possible to stop and start JMX Agent at runtime
dsamersoff
parents: 11530
diff changeset
   254
    private static JMXConnectorServer jmxServer = null;
30334
22a5f09f4da9 8023093: Add ManagementAgent.status diagnostic command
jbachorik
parents: 27957
diff changeset
   255
    // The properties used to configure the server
22a5f09f4da9 8023093: Add ManagementAgent.status diagnostic command
jbachorik
parents: 27957
diff changeset
   256
    private static Properties configProps = null;
11991
800d0ff7b043 7110104: It should be possible to stop and start JMX Agent at runtime
dsamersoff
parents: 11530
diff changeset
   257
800d0ff7b043 7110104: It should be possible to stop and start JMX Agent at runtime
dsamersoff
parents: 11530
diff changeset
   258
    // Parse string com.sun.management.prop=xxx,com.sun.management.prop=yyyy
800d0ff7b043 7110104: It should be possible to stop and start JMX Agent at runtime
dsamersoff
parents: 11530
diff changeset
   259
    // and return property set if args is null or empty
800d0ff7b043 7110104: It should be possible to stop and start JMX Agent at runtime
dsamersoff
parents: 11530
diff changeset
   260
    // return empty property set
15531
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents: 12694
diff changeset
   261
    private static Properties parseString(String args) {
11991
800d0ff7b043 7110104: It should be possible to stop and start JMX Agent at runtime
dsamersoff
parents: 11530
diff changeset
   262
        Properties argProps = new Properties();
24980
dbf4ae2cafa4 8046778: Better error messages when starting JMX agent via attach or jcmd
sla
parents: 24969
diff changeset
   263
        if (args != null && !args.trim().equals("")) {
15531
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents: 12694
diff changeset
   264
            for (String option : args.split(",")) {
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents: 12694
diff changeset
   265
                String s[] = option.split("=", 2);
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents: 12694
diff changeset
   266
                String name = s[0].trim();
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents: 12694
diff changeset
   267
                String value = (s.length > 1) ? s[1].trim() : "";
11991
800d0ff7b043 7110104: It should be possible to stop and start JMX Agent at runtime
dsamersoff
parents: 11530
diff changeset
   268
15531
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents: 12694
diff changeset
   269
                if (!name.startsWith("com.sun.management.")) {
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents: 12694
diff changeset
   270
                    error(INVALID_OPTION, name);
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents: 12694
diff changeset
   271
                }
11991
800d0ff7b043 7110104: It should be possible to stop and start JMX Agent at runtime
dsamersoff
parents: 11530
diff changeset
   272
15531
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents: 12694
diff changeset
   273
                argProps.setProperty(name, value);
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents: 12694
diff changeset
   274
            }
11991
800d0ff7b043 7110104: It should be possible to stop and start JMX Agent at runtime
dsamersoff
parents: 11530
diff changeset
   275
        }
800d0ff7b043 7110104: It should be possible to stop and start JMX Agent at runtime
dsamersoff
parents: 11530
diff changeset
   276
800d0ff7b043 7110104: It should be possible to stop and start JMX Agent at runtime
dsamersoff
parents: 11530
diff changeset
   277
        return argProps;
800d0ff7b043 7110104: It should be possible to stop and start JMX Agent at runtime
dsamersoff
parents: 11530
diff changeset
   278
    }
800d0ff7b043 7110104: It should be possible to stop and start JMX Agent at runtime
dsamersoff
parents: 11530
diff changeset
   279
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   280
    // invoked by -javaagent or -Dcom.sun.management.agent.class
90ce3da70b43 Initial load
duke
parents:
diff changeset
   281
    public static void premain(String args) throws Exception {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   282
        agentmain(args);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   283
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   284
90ce3da70b43 Initial load
duke
parents:
diff changeset
   285
    // invoked by attach mechanism
90ce3da70b43 Initial load
duke
parents:
diff changeset
   286
    public static void agentmain(String args) throws Exception {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   287
        if (args == null || args.length() == 0) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   288
            args = JMXREMOTE;           // default to local management
90ce3da70b43 Initial load
duke
parents:
diff changeset
   289
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   290
11991
800d0ff7b043 7110104: It should be possible to stop and start JMX Agent at runtime
dsamersoff
parents: 11530
diff changeset
   291
        Properties arg_props = parseString(args);
800d0ff7b043 7110104: It should be possible to stop and start JMX Agent at runtime
dsamersoff
parents: 11530
diff changeset
   292
800d0ff7b043 7110104: It should be possible to stop and start JMX Agent at runtime
dsamersoff
parents: 11530
diff changeset
   293
        // Read properties from the config file
15531
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents: 12694
diff changeset
   294
        Properties config_props = new Properties();
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents: 12694
diff changeset
   295
        String fname = arg_props.getProperty(CONFIG_FILE);
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents: 12694
diff changeset
   296
        readConfiguration(fname, config_props);
11991
800d0ff7b043 7110104: It should be possible to stop and start JMX Agent at runtime
dsamersoff
parents: 11530
diff changeset
   297
15531
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents: 12694
diff changeset
   298
        // Arguments override config file
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents: 12694
diff changeset
   299
        config_props.putAll(arg_props);
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents: 12694
diff changeset
   300
        startAgent(config_props);
11991
800d0ff7b043 7110104: It should be possible to stop and start JMX Agent at runtime
dsamersoff
parents: 11530
diff changeset
   301
    }
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   302
11991
800d0ff7b043 7110104: It should be possible to stop and start JMX Agent at runtime
dsamersoff
parents: 11530
diff changeset
   303
    // jcmd ManagementAgent.start_local entry point
800d0ff7b043 7110104: It should be possible to stop and start JMX Agent at runtime
dsamersoff
parents: 11530
diff changeset
   304
    // Also called due to command-line via startAgent()
15531
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents: 12694
diff changeset
   305
    private static synchronized void startLocalManagementAgent() {
11991
800d0ff7b043 7110104: It should be possible to stop and start JMX Agent at runtime
dsamersoff
parents: 11530
diff changeset
   306
        Properties agentProps = VMSupport.getAgentProperties();
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   307
11991
800d0ff7b043 7110104: It should be possible to stop and start JMX Agent at runtime
dsamersoff
parents: 11530
diff changeset
   308
        // start local connector if not started
800d0ff7b043 7110104: It should be possible to stop and start JMX Agent at runtime
dsamersoff
parents: 11530
diff changeset
   309
        if (agentProps.get(LOCAL_CONNECTOR_ADDRESS_PROP) == null) {
800d0ff7b043 7110104: It should be possible to stop and start JMX Agent at runtime
dsamersoff
parents: 11530
diff changeset
   310
            JMXConnectorServer cs = ConnectorBootstrap.startLocalConnectorServer();
800d0ff7b043 7110104: It should be possible to stop and start JMX Agent at runtime
dsamersoff
parents: 11530
diff changeset
   311
            String address = cs.getAddress().toString();
800d0ff7b043 7110104: It should be possible to stop and start JMX Agent at runtime
dsamersoff
parents: 11530
diff changeset
   312
            // Add the local connector address to the agent properties
800d0ff7b043 7110104: It should be possible to stop and start JMX Agent at runtime
dsamersoff
parents: 11530
diff changeset
   313
            agentProps.put(LOCAL_CONNECTOR_ADDRESS_PROP, address);
800d0ff7b043 7110104: It should be possible to stop and start JMX Agent at runtime
dsamersoff
parents: 11530
diff changeset
   314
800d0ff7b043 7110104: It should be possible to stop and start JMX Agent at runtime
dsamersoff
parents: 11530
diff changeset
   315
            try {
800d0ff7b043 7110104: It should be possible to stop and start JMX Agent at runtime
dsamersoff
parents: 11530
diff changeset
   316
                // export the address to the instrumentation buffer
800d0ff7b043 7110104: It should be possible to stop and start JMX Agent at runtime
dsamersoff
parents: 11530
diff changeset
   317
                ConnectorAddressLink.export(address);
800d0ff7b043 7110104: It should be possible to stop and start JMX Agent at runtime
dsamersoff
parents: 11530
diff changeset
   318
            } catch (Exception x) {
800d0ff7b043 7110104: It should be possible to stop and start JMX Agent at runtime
dsamersoff
parents: 11530
diff changeset
   319
                // Connector server started but unable to export address
800d0ff7b043 7110104: It should be possible to stop and start JMX Agent at runtime
dsamersoff
parents: 11530
diff changeset
   320
                // to instrumentation buffer - non-fatal error.
800d0ff7b043 7110104: It should be possible to stop and start JMX Agent at runtime
dsamersoff
parents: 11530
diff changeset
   321
                warning(EXPORT_ADDRESS_FAILED, x.getMessage());
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   322
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   323
        }
11991
800d0ff7b043 7110104: It should be possible to stop and start JMX Agent at runtime
dsamersoff
parents: 11530
diff changeset
   324
    }
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   325
11991
800d0ff7b043 7110104: It should be possible to stop and start JMX Agent at runtime
dsamersoff
parents: 11530
diff changeset
   326
    // jcmd ManagementAgent.start entry point
800d0ff7b043 7110104: It should be possible to stop and start JMX Agent at runtime
dsamersoff
parents: 11530
diff changeset
   327
    // This method starts the remote JMX agent and starts neither
800d0ff7b043 7110104: It should be possible to stop and start JMX Agent at runtime
dsamersoff
parents: 11530
diff changeset
   328
    // the local JMX agent nor the SNMP agent
800d0ff7b043 7110104: It should be possible to stop and start JMX Agent at runtime
dsamersoff
parents: 11530
diff changeset
   329
    // @see #startLocalManagementAgent and also @see #startAgent.
800d0ff7b043 7110104: It should be possible to stop and start JMX Agent at runtime
dsamersoff
parents: 11530
diff changeset
   330
    private static synchronized void startRemoteManagementAgent(String args) throws Exception {
800d0ff7b043 7110104: It should be possible to stop and start JMX Agent at runtime
dsamersoff
parents: 11530
diff changeset
   331
        if (jmxServer != null) {
800d0ff7b043 7110104: It should be possible to stop and start JMX Agent at runtime
dsamersoff
parents: 11530
diff changeset
   332
            throw new RuntimeException(getText(INVALID_STATE, "Agent already started"));
800d0ff7b043 7110104: It should be possible to stop and start JMX Agent at runtime
dsamersoff
parents: 11530
diff changeset
   333
        }
800d0ff7b043 7110104: It should be possible to stop and start JMX Agent at runtime
dsamersoff
parents: 11530
diff changeset
   334
24980
dbf4ae2cafa4 8046778: Better error messages when starting JMX agent via attach or jcmd
sla
parents: 24969
diff changeset
   335
        try {
dbf4ae2cafa4 8046778: Better error messages when starting JMX agent via attach or jcmd
sla
parents: 24969
diff changeset
   336
            Properties argProps = parseString(args);
30334
22a5f09f4da9 8023093: Add ManagementAgent.status diagnostic command
jbachorik
parents: 27957
diff changeset
   337
            configProps = new Properties();
11991
800d0ff7b043 7110104: It should be possible to stop and start JMX Agent at runtime
dsamersoff
parents: 11530
diff changeset
   338
24980
dbf4ae2cafa4 8046778: Better error messages when starting JMX agent via attach or jcmd
sla
parents: 24969
diff changeset
   339
            // Load the management properties from the config file
dbf4ae2cafa4 8046778: Better error messages when starting JMX agent via attach or jcmd
sla
parents: 24969
diff changeset
   340
            // if config file is not specified readConfiguration implicitly
27565
729f9700483a 8049367: Modular Run-Time Images
chegar
parents: 26488
diff changeset
   341
            // reads <java.home>/conf/management/management.properties
24980
dbf4ae2cafa4 8046778: Better error messages when starting JMX agent via attach or jcmd
sla
parents: 24969
diff changeset
   342
dbf4ae2cafa4 8046778: Better error messages when starting JMX agent via attach or jcmd
sla
parents: 24969
diff changeset
   343
            String fname = System.getProperty(CONFIG_FILE);
dbf4ae2cafa4 8046778: Better error messages when starting JMX agent via attach or jcmd
sla
parents: 24969
diff changeset
   344
            readConfiguration(fname, configProps);
11991
800d0ff7b043 7110104: It should be possible to stop and start JMX Agent at runtime
dsamersoff
parents: 11530
diff changeset
   345
24980
dbf4ae2cafa4 8046778: Better error messages when starting JMX agent via attach or jcmd
sla
parents: 24969
diff changeset
   346
            // management properties can be overridden by system properties
dbf4ae2cafa4 8046778: Better error messages when starting JMX agent via attach or jcmd
sla
parents: 24969
diff changeset
   347
            // which take precedence
dbf4ae2cafa4 8046778: Better error messages when starting JMX agent via attach or jcmd
sla
parents: 24969
diff changeset
   348
            Properties sysProps = System.getProperties();
dbf4ae2cafa4 8046778: Better error messages when starting JMX agent via attach or jcmd
sla
parents: 24969
diff changeset
   349
            synchronized (sysProps) {
dbf4ae2cafa4 8046778: Better error messages when starting JMX agent via attach or jcmd
sla
parents: 24969
diff changeset
   350
                configProps.putAll(sysProps);
dbf4ae2cafa4 8046778: Better error messages when starting JMX agent via attach or jcmd
sla
parents: 24969
diff changeset
   351
            }
11991
800d0ff7b043 7110104: It should be possible to stop and start JMX Agent at runtime
dsamersoff
parents: 11530
diff changeset
   352
24980
dbf4ae2cafa4 8046778: Better error messages when starting JMX agent via attach or jcmd
sla
parents: 24969
diff changeset
   353
            // if user specifies config file into command line for either
dbf4ae2cafa4 8046778: Better error messages when starting JMX agent via attach or jcmd
sla
parents: 24969
diff changeset
   354
            // jcmd utilities or attach command it overrides properties set in
dbf4ae2cafa4 8046778: Better error messages when starting JMX agent via attach or jcmd
sla
parents: 24969
diff changeset
   355
            // command line at the time of VM start
dbf4ae2cafa4 8046778: Better error messages when starting JMX agent via attach or jcmd
sla
parents: 24969
diff changeset
   356
            String fnameUser = argProps.getProperty(CONFIG_FILE);
dbf4ae2cafa4 8046778: Better error messages when starting JMX agent via attach or jcmd
sla
parents: 24969
diff changeset
   357
            if (fnameUser != null) {
dbf4ae2cafa4 8046778: Better error messages when starting JMX agent via attach or jcmd
sla
parents: 24969
diff changeset
   358
                readConfiguration(fnameUser, configProps);
dbf4ae2cafa4 8046778: Better error messages when starting JMX agent via attach or jcmd
sla
parents: 24969
diff changeset
   359
            }
11991
800d0ff7b043 7110104: It should be possible to stop and start JMX Agent at runtime
dsamersoff
parents: 11530
diff changeset
   360
24980
dbf4ae2cafa4 8046778: Better error messages when starting JMX agent via attach or jcmd
sla
parents: 24969
diff changeset
   361
            // arguments specified in command line of jcmd utilities
dbf4ae2cafa4 8046778: Better error messages when starting JMX agent via attach or jcmd
sla
parents: 24969
diff changeset
   362
            // override both system properties and one set by config file
dbf4ae2cafa4 8046778: Better error messages when starting JMX agent via attach or jcmd
sla
parents: 24969
diff changeset
   363
            // specified in jcmd command line
dbf4ae2cafa4 8046778: Better error messages when starting JMX agent via attach or jcmd
sla
parents: 24969
diff changeset
   364
            configProps.putAll(argProps);
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   365
24980
dbf4ae2cafa4 8046778: Better error messages when starting JMX agent via attach or jcmd
sla
parents: 24969
diff changeset
   366
            // jcmd doesn't allow to change ThreadContentionMonitoring, but user
dbf4ae2cafa4 8046778: Better error messages when starting JMX agent via attach or jcmd
sla
parents: 24969
diff changeset
   367
            // can specify this property inside config file, so enable optional
dbf4ae2cafa4 8046778: Better error messages when starting JMX agent via attach or jcmd
sla
parents: 24969
diff changeset
   368
            // monitoring functionality if this property is set
dbf4ae2cafa4 8046778: Better error messages when starting JMX agent via attach or jcmd
sla
parents: 24969
diff changeset
   369
            final String enableThreadContentionMonitoring =
dbf4ae2cafa4 8046778: Better error messages when starting JMX agent via attach or jcmd
sla
parents: 24969
diff changeset
   370
                    configProps.getProperty(ENABLE_THREAD_CONTENTION_MONITORING);
11991
800d0ff7b043 7110104: It should be possible to stop and start JMX Agent at runtime
dsamersoff
parents: 11530
diff changeset
   371
24980
dbf4ae2cafa4 8046778: Better error messages when starting JMX agent via attach or jcmd
sla
parents: 24969
diff changeset
   372
            if (enableThreadContentionMonitoring != null) {
dbf4ae2cafa4 8046778: Better error messages when starting JMX agent via attach or jcmd
sla
parents: 24969
diff changeset
   373
                ManagementFactory.getThreadMXBean().
dbf4ae2cafa4 8046778: Better error messages when starting JMX agent via attach or jcmd
sla
parents: 24969
diff changeset
   374
                        setThreadContentionMonitoringEnabled(true);
dbf4ae2cafa4 8046778: Better error messages when starting JMX agent via attach or jcmd
sla
parents: 24969
diff changeset
   375
            }
11991
800d0ff7b043 7110104: It should be possible to stop and start JMX Agent at runtime
dsamersoff
parents: 11530
diff changeset
   376
24980
dbf4ae2cafa4 8046778: Better error messages when starting JMX agent via attach or jcmd
sla
parents: 24969
diff changeset
   377
            String jmxremotePort = configProps.getProperty(JMXREMOTE_PORT);
dbf4ae2cafa4 8046778: Better error messages when starting JMX agent via attach or jcmd
sla
parents: 24969
diff changeset
   378
            if (jmxremotePort != null) {
dbf4ae2cafa4 8046778: Better error messages when starting JMX agent via attach or jcmd
sla
parents: 24969
diff changeset
   379
                jmxServer = ConnectorBootstrap.
dbf4ae2cafa4 8046778: Better error messages when starting JMX agent via attach or jcmd
sla
parents: 24969
diff changeset
   380
                        startRemoteConnectorServer(jmxremotePort, configProps);
11991
800d0ff7b043 7110104: It should be possible to stop and start JMX Agent at runtime
dsamersoff
parents: 11530
diff changeset
   381
24980
dbf4ae2cafa4 8046778: Better error messages when starting JMX agent via attach or jcmd
sla
parents: 24969
diff changeset
   382
                startDiscoveryService(configProps);
dbf4ae2cafa4 8046778: Better error messages when starting JMX agent via attach or jcmd
sla
parents: 24969
diff changeset
   383
            } else {
dbf4ae2cafa4 8046778: Better error messages when starting JMX agent via attach or jcmd
sla
parents: 24969
diff changeset
   384
                throw new AgentConfigurationError(INVALID_JMXREMOTE_PORT, "No port specified");
dbf4ae2cafa4 8046778: Better error messages when starting JMX agent via attach or jcmd
sla
parents: 24969
diff changeset
   385
            }
26488
5b5fccd9d016 8057746: Cannot handle JdpException in JMX agent initialization.
dsamersoff
parents: 25859
diff changeset
   386
        } catch (JdpException e) {
5b5fccd9d016 8057746: Cannot handle JdpException in JMX agent initialization.
dsamersoff
parents: 25859
diff changeset
   387
            error(e);
24980
dbf4ae2cafa4 8046778: Better error messages when starting JMX agent via attach or jcmd
sla
parents: 24969
diff changeset
   388
        } catch (AgentConfigurationError err) {
45009
c39425655469 8177721: Improve diagnostics in sun.management.Agent#startAgent()
shshahma
parents: 43719
diff changeset
   389
            error(err);
11991
800d0ff7b043 7110104: It should be possible to stop and start JMX Agent at runtime
dsamersoff
parents: 11530
diff changeset
   390
        }
800d0ff7b043 7110104: It should be possible to stop and start JMX Agent at runtime
dsamersoff
parents: 11530
diff changeset
   391
    }
800d0ff7b043 7110104: It should be possible to stop and start JMX Agent at runtime
dsamersoff
parents: 11530
diff changeset
   392
800d0ff7b043 7110104: It should be possible to stop and start JMX Agent at runtime
dsamersoff
parents: 11530
diff changeset
   393
    private static synchronized void stopRemoteManagementAgent() throws Exception {
15531
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents: 12694
diff changeset
   394
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents: 12694
diff changeset
   395
        JdpController.stopDiscoveryService();
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents: 12694
diff changeset
   396
11991
800d0ff7b043 7110104: It should be possible to stop and start JMX Agent at runtime
dsamersoff
parents: 11530
diff changeset
   397
        if (jmxServer != null) {
800d0ff7b043 7110104: It should be possible to stop and start JMX Agent at runtime
dsamersoff
parents: 11530
diff changeset
   398
            ConnectorBootstrap.unexportRegistry();
30803
17e70318af8b 8075926: Add a sun.management.JMXConnectorServer perf counter to track its state
jbachorik
parents: 30334
diff changeset
   399
            ConnectorAddressLink.unexportRemote();
11991
800d0ff7b043 7110104: It should be possible to stop and start JMX Agent at runtime
dsamersoff
parents: 11530
diff changeset
   400
800d0ff7b043 7110104: It should be possible to stop and start JMX Agent at runtime
dsamersoff
parents: 11530
diff changeset
   401
            // Attempt to stop already stopped agent
800d0ff7b043 7110104: It should be possible to stop and start JMX Agent at runtime
dsamersoff
parents: 11530
diff changeset
   402
            // Don't cause any errors.
800d0ff7b043 7110104: It should be possible to stop and start JMX Agent at runtime
dsamersoff
parents: 11530
diff changeset
   403
            jmxServer.stop();
800d0ff7b043 7110104: It should be possible to stop and start JMX Agent at runtime
dsamersoff
parents: 11530
diff changeset
   404
            jmxServer = null;
30334
22a5f09f4da9 8023093: Add ManagementAgent.status diagnostic command
jbachorik
parents: 27957
diff changeset
   405
            configProps = null;
11991
800d0ff7b043 7110104: It should be possible to stop and start JMX Agent at runtime
dsamersoff
parents: 11530
diff changeset
   406
        }
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   407
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   408
30334
22a5f09f4da9 8023093: Add ManagementAgent.status diagnostic command
jbachorik
parents: 27957
diff changeset
   409
    private static synchronized String getManagementAgentStatus() throws Exception {
22a5f09f4da9 8023093: Add ManagementAgent.status diagnostic command
jbachorik
parents: 27957
diff changeset
   410
        return new TextStatusCollector().collect();
22a5f09f4da9 8023093: Add ManagementAgent.status diagnostic command
jbachorik
parents: 27957
diff changeset
   411
    }
22a5f09f4da9 8023093: Add ManagementAgent.status diagnostic command
jbachorik
parents: 27957
diff changeset
   412
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   413
    private static void startAgent(Properties props) throws Exception {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   414
        String snmpPort = props.getProperty(SNMP_PORT);
55985
0c5a02edfdef REST Adapter Initial commit
hb
parents: 47216
diff changeset
   415
        String restPort = props.getProperty(REST_PORT);
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   416
        String jmxremote = props.getProperty(JMXREMOTE);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   417
        String jmxremotePort = props.getProperty(JMXREMOTE_PORT);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   418
90ce3da70b43 Initial load
duke
parents:
diff changeset
   419
        // Enable optional monitoring functionality if requested
90ce3da70b43 Initial load
duke
parents:
diff changeset
   420
        final String enableThreadContentionMonitoring =
15531
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents: 12694
diff changeset
   421
                props.getProperty(ENABLE_THREAD_CONTENTION_MONITORING);
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   422
        if (enableThreadContentionMonitoring != null) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   423
            ManagementFactory.getThreadMXBean().
15531
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents: 12694
diff changeset
   424
                    setThreadContentionMonitoringEnabled(true);
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   425
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   426
90ce3da70b43 Initial load
duke
parents:
diff changeset
   427
        try {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   428
            if (snmpPort != null) {
40743
a775e4de954f 8131061: Use of -Dcom.sun.management.snmp needs to be examined for modules
vtewari
parents: 36854
diff changeset
   429
                loadSnmpAgent(props);
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   430
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   431
55985
0c5a02edfdef REST Adapter Initial commit
hb
parents: 47216
diff changeset
   432
            if (restPort != null) {
0c5a02edfdef REST Adapter Initial commit
hb
parents: 47216
diff changeset
   433
                loadRestAdapter(props);
0c5a02edfdef REST Adapter Initial commit
hb
parents: 47216
diff changeset
   434
            }
0c5a02edfdef REST Adapter Initial commit
hb
parents: 47216
diff changeset
   435
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   436
            /*
90ce3da70b43 Initial load
duke
parents:
diff changeset
   437
             * If the jmxremote.port property is set then we start the
90ce3da70b43 Initial load
duke
parents:
diff changeset
   438
             * RMIConnectorServer for remote M&M.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   439
             *
90ce3da70b43 Initial load
duke
parents:
diff changeset
   440
             * If the jmxremote or jmxremote.port properties are set then
90ce3da70b43 Initial load
duke
parents:
diff changeset
   441
             * we start a RMIConnectorServer for local M&M. The address
90ce3da70b43 Initial load
duke
parents:
diff changeset
   442
             * of this "local" server is exported as a counter to the jstat
90ce3da70b43 Initial load
duke
parents:
diff changeset
   443
             * instrumentation buffer.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   444
             */
15531
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents: 12694
diff changeset
   445
            if (jmxremote != null || jmxremotePort != null) {
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   446
                if (jmxremotePort != null) {
15531
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents: 12694
diff changeset
   447
                    jmxServer = ConnectorBootstrap.
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents: 12694
diff changeset
   448
                            startRemoteConnectorServer(jmxremotePort, props);
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents: 12694
diff changeset
   449
                    startDiscoveryService(props);
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   450
                }
11991
800d0ff7b043 7110104: It should be possible to stop and start JMX Agent at runtime
dsamersoff
parents: 11530
diff changeset
   451
                startLocalManagementAgent();
15531
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents: 12694
diff changeset
   452
            }
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   453
90ce3da70b43 Initial load
duke
parents:
diff changeset
   454
        } catch (AgentConfigurationError e) {
45009
c39425655469 8177721: Improve diagnostics in sun.management.Agent#startAgent()
shshahma
parents: 43719
diff changeset
   455
            error(e);
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   456
        } catch (Exception e) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   457
            error(e);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   458
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   459
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   460
15531
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents: 12694
diff changeset
   461
    private static void startDiscoveryService(Properties props)
26488
5b5fccd9d016 8057746: Cannot handle JdpException in JMX agent initialization.
dsamersoff
parents: 25859
diff changeset
   462
            throws IOException, JdpException {
15531
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents: 12694
diff changeset
   463
        // Start discovery service if requested
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents: 12694
diff changeset
   464
        String discoveryPort = props.getProperty("com.sun.management.jdp.port");
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents: 12694
diff changeset
   465
        String discoveryAddress = props.getProperty("com.sun.management.jdp.address");
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents: 12694
diff changeset
   466
        String discoveryShouldStart = props.getProperty("com.sun.management.jmxremote.autodiscovery");
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents: 12694
diff changeset
   467
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents: 12694
diff changeset
   468
        // Decide whether we should start autodicovery service.
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents: 12694
diff changeset
   469
        // To start autodiscovery following conditions should be met:
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents: 12694
diff changeset
   470
        // autodiscovery==true OR (autodicovery==null AND jdp.port != NULL)
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents: 12694
diff changeset
   471
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents: 12694
diff changeset
   472
        boolean shouldStart = false;
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents: 12694
diff changeset
   473
        if (discoveryShouldStart == null){
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents: 12694
diff changeset
   474
            shouldStart = (discoveryPort != null);
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents: 12694
diff changeset
   475
        }
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents: 12694
diff changeset
   476
        else{
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents: 12694
diff changeset
   477
            try{
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents: 12694
diff changeset
   478
               shouldStart = Boolean.parseBoolean(discoveryShouldStart);
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents: 12694
diff changeset
   479
            } catch (NumberFormatException e) {
26488
5b5fccd9d016 8057746: Cannot handle JdpException in JMX agent initialization.
dsamersoff
parents: 25859
diff changeset
   480
                throw new AgentConfigurationError(AGENT_EXCEPTION, "Couldn't parse autodiscovery argument");
15531
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents: 12694
diff changeset
   481
            }
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents: 12694
diff changeset
   482
        }
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents: 12694
diff changeset
   483
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents: 12694
diff changeset
   484
        if (shouldStart) {
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents: 12694
diff changeset
   485
            // port and address are required arguments and have no default values
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents: 12694
diff changeset
   486
            InetAddress address;
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents: 12694
diff changeset
   487
            try {
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents: 12694
diff changeset
   488
                address = (discoveryAddress == null) ?
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents: 12694
diff changeset
   489
                        InetAddress.getByName(JDP_DEFAULT_ADDRESS) : InetAddress.getByName(discoveryAddress);
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents: 12694
diff changeset
   490
            } catch (UnknownHostException e) {
26488
5b5fccd9d016 8057746: Cannot handle JdpException in JMX agent initialization.
dsamersoff
parents: 25859
diff changeset
   491
                throw new AgentConfigurationError(AGENT_EXCEPTION, e, "Unable to broadcast to requested address");
15531
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents: 12694
diff changeset
   492
            }
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents: 12694
diff changeset
   493
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents: 12694
diff changeset
   494
            int port = JDP_DEFAULT_PORT;
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents: 12694
diff changeset
   495
            if (discoveryPort != null) {
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents: 12694
diff changeset
   496
               try {
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents: 12694
diff changeset
   497
                  port = Integer.parseInt(discoveryPort);
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents: 12694
diff changeset
   498
               } catch (NumberFormatException e) {
26488
5b5fccd9d016 8057746: Cannot handle JdpException in JMX agent initialization.
dsamersoff
parents: 25859
diff changeset
   499
                 throw new AgentConfigurationError(AGENT_EXCEPTION, "Couldn't parse JDP port argument");
15531
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents: 12694
diff changeset
   500
               }
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents: 12694
diff changeset
   501
            }
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents: 12694
diff changeset
   502
43538
jwilhelm
parents: 43494
diff changeset
   503
            // Get service URL to broadcast it
jwilhelm
parents: 43494
diff changeset
   504
            Map<String,String> remoteProps = ConnectorAddressLink.importRemoteFrom(0);
jwilhelm
parents: 43494
diff changeset
   505
            String jmxUrlStr = remoteProps.get("sun.management.JMXConnectorServer.0.remoteAddress");
15531
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents: 12694
diff changeset
   506
21298
d8a11a962ee3 8024071: In ManagementAgent.start it should be possible to set the jdp.name parameter.
dsamersoff
parents: 17721
diff changeset
   507
            String instanceName = props.getProperty("com.sun.management.jdp.name");
15531
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents: 12694
diff changeset
   508
26488
5b5fccd9d016 8057746: Cannot handle JdpException in JMX agent initialization.
dsamersoff
parents: 25859
diff changeset
   509
            JdpController.startDiscoveryService(address, port, instanceName, jmxUrlStr);
15531
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents: 12694
diff changeset
   510
        }
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents: 12694
diff changeset
   511
    }
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents: 12694
diff changeset
   512
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   513
    public static Properties loadManagementProperties() {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   514
        Properties props = new Properties();
90ce3da70b43 Initial load
duke
parents:
diff changeset
   515
90ce3da70b43 Initial load
duke
parents:
diff changeset
   516
        // Load the management properties from the config file
90ce3da70b43 Initial load
duke
parents:
diff changeset
   517
90ce3da70b43 Initial load
duke
parents:
diff changeset
   518
        String fname = System.getProperty(CONFIG_FILE);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   519
        readConfiguration(fname, props);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   520
90ce3da70b43 Initial load
duke
parents:
diff changeset
   521
        // management properties can be overridden by system properties
90ce3da70b43 Initial load
duke
parents:
diff changeset
   522
        // which take precedence
12694
543c5e6c5ed0 7164191: properties.putAll API may fail with ConcurrentModifcationException on multi-thread scenario
dsamersoff
parents: 11991
diff changeset
   523
        Properties sysProps = System.getProperties();
15531
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents: 12694
diff changeset
   524
        synchronized (sysProps) {
12694
543c5e6c5ed0 7164191: properties.putAll API may fail with ConcurrentModifcationException on multi-thread scenario
dsamersoff
parents: 11991
diff changeset
   525
            props.putAll(sysProps);
543c5e6c5ed0 7164191: properties.putAll API may fail with ConcurrentModifcationException on multi-thread scenario
dsamersoff
parents: 11991
diff changeset
   526
        }
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   527
90ce3da70b43 Initial load
duke
parents:
diff changeset
   528
        return props;
15531
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents: 12694
diff changeset
   529
    }
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   530
15531
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents: 12694
diff changeset
   531
    public static synchronized Properties getManagementProperties() {
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   532
        if (mgmtProps == null) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   533
            String configFile = System.getProperty(CONFIG_FILE);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   534
            String snmpPort = System.getProperty(SNMP_PORT);
55985
0c5a02edfdef REST Adapter Initial commit
hb
parents: 47216
diff changeset
   535
            String restPort = System.getProperty(REST_PORT);
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   536
            String jmxremote = System.getProperty(JMXREMOTE);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   537
            String jmxremotePort = System.getProperty(JMXREMOTE_PORT);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   538
55985
0c5a02edfdef REST Adapter Initial commit
hb
parents: 47216
diff changeset
   539
            if (configFile == null && snmpPort == null && restPort == null
15531
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents: 12694
diff changeset
   540
                    && jmxremote == null && jmxremotePort == null) {
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   541
                // return if out-of-the-management option is not specified
90ce3da70b43 Initial load
duke
parents:
diff changeset
   542
                return null;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   543
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   544
            mgmtProps = loadManagementProperties();
90ce3da70b43 Initial load
duke
parents:
diff changeset
   545
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   546
        return mgmtProps;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   547
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   548
55985
0c5a02edfdef REST Adapter Initial commit
hb
parents: 47216
diff changeset
   549
    private static void loadRestAdapter(Properties props) {
56026
bd531f08d7c7 1. Removed all changes to Java SE APIs
hb
parents: 56003
diff changeset
   550
         /*
bd531f08d7c7 1. Removed all changes to Java SE APIs
hb
parents: 56003
diff changeset
   551
         * Load the rest adapter service
bd531f08d7c7 1. Removed all changes to Java SE APIs
hb
parents: 56003
diff changeset
   552
         */
bd531f08d7c7 1. Removed all changes to Java SE APIs
hb
parents: 56003
diff changeset
   553
        AgentProvider provider = AccessController.doPrivileged(
bd531f08d7c7 1. Removed all changes to Java SE APIs
hb
parents: 56003
diff changeset
   554
                (PrivilegedAction<AgentProvider>) () -> {
bd531f08d7c7 1. Removed all changes to Java SE APIs
hb
parents: 56003
diff changeset
   555
                    for (AgentProvider aProvider : ServiceLoader.loadInstalled(AgentProvider.class)) {
bd531f08d7c7 1. Removed all changes to Java SE APIs
hb
parents: 56003
diff changeset
   556
                        if (aProvider.getName().equals(REST_ADAPTER_NAME))
bd531f08d7c7 1. Removed all changes to Java SE APIs
hb
parents: 56003
diff changeset
   557
                            return aProvider;
bd531f08d7c7 1. Removed all changes to Java SE APIs
hb
parents: 56003
diff changeset
   558
                    }
bd531f08d7c7 1. Removed all changes to Java SE APIs
hb
parents: 56003
diff changeset
   559
                    return null;
bd531f08d7c7 1. Removed all changes to Java SE APIs
hb
parents: 56003
diff changeset
   560
                },  null
bd531f08d7c7 1. Removed all changes to Java SE APIs
hb
parents: 56003
diff changeset
   561
        );
bd531f08d7c7 1. Removed all changes to Java SE APIs
hb
parents: 56003
diff changeset
   562
bd531f08d7c7 1. Removed all changes to Java SE APIs
hb
parents: 56003
diff changeset
   563
        if (provider != null) {
bd531f08d7c7 1. Removed all changes to Java SE APIs
hb
parents: 56003
diff changeset
   564
            provider.startAgent(props);
bd531f08d7c7 1. Removed all changes to Java SE APIs
hb
parents: 56003
diff changeset
   565
        } else { // Rest adapter doesn't exist - initialization fails
bd531f08d7c7 1. Removed all changes to Java SE APIs
hb
parents: 56003
diff changeset
   566
            throw new UnsupportedOperationException("Unsupported management property: " + REST_PORT);
55985
0c5a02edfdef REST Adapter Initial commit
hb
parents: 47216
diff changeset
   567
        }
0c5a02edfdef REST Adapter Initial commit
hb
parents: 47216
diff changeset
   568
    }
0c5a02edfdef REST Adapter Initial commit
hb
parents: 47216
diff changeset
   569
40743
a775e4de954f 8131061: Use of -Dcom.sun.management.snmp needs to be examined for modules
vtewari
parents: 36854
diff changeset
   570
    private static void loadSnmpAgent(Properties props) {
a775e4de954f 8131061: Use of -Dcom.sun.management.snmp needs to be examined for modules
vtewari
parents: 36854
diff changeset
   571
        /*
a775e4de954f 8131061: Use of -Dcom.sun.management.snmp needs to be examined for modules
vtewari
parents: 36854
diff changeset
   572
         * Load the jdk.snmp service
a775e4de954f 8131061: Use of -Dcom.sun.management.snmp needs to be examined for modules
vtewari
parents: 36854
diff changeset
   573
         */
a775e4de954f 8131061: Use of -Dcom.sun.management.snmp needs to be examined for modules
vtewari
parents: 36854
diff changeset
   574
        AgentProvider provider = AccessController.doPrivileged(
a775e4de954f 8131061: Use of -Dcom.sun.management.snmp needs to be examined for modules
vtewari
parents: 36854
diff changeset
   575
            (PrivilegedAction<AgentProvider>) () -> {
43494
11801b2ff456 8173608: Separate JDK management agent from java.management module
mchung
parents: 40743
diff changeset
   576
                for (AgentProvider aProvider : ServiceLoader.loadInstalled(AgentProvider.class)) {
11801b2ff456 8173608: Separate JDK management agent from java.management module
mchung
parents: 40743
diff changeset
   577
                    if (aProvider.getName().equals(SNMP_AGENT_NAME))
40743
a775e4de954f 8131061: Use of -Dcom.sun.management.snmp needs to be examined for modules
vtewari
parents: 36854
diff changeset
   578
                        return aProvider;
a775e4de954f 8131061: Use of -Dcom.sun.management.snmp needs to be examined for modules
vtewari
parents: 36854
diff changeset
   579
                }
a775e4de954f 8131061: Use of -Dcom.sun.management.snmp needs to be examined for modules
vtewari
parents: 36854
diff changeset
   580
                return null;
a775e4de954f 8131061: Use of -Dcom.sun.management.snmp needs to be examined for modules
vtewari
parents: 36854
diff changeset
   581
            },  null
a775e4de954f 8131061: Use of -Dcom.sun.management.snmp needs to be examined for modules
vtewari
parents: 36854
diff changeset
   582
        );
a775e4de954f 8131061: Use of -Dcom.sun.management.snmp needs to be examined for modules
vtewari
parents: 36854
diff changeset
   583
a775e4de954f 8131061: Use of -Dcom.sun.management.snmp needs to be examined for modules
vtewari
parents: 36854
diff changeset
   584
        if (provider != null) {
a775e4de954f 8131061: Use of -Dcom.sun.management.snmp needs to be examined for modules
vtewari
parents: 36854
diff changeset
   585
            provider.startAgent(props);
a775e4de954f 8131061: Use of -Dcom.sun.management.snmp needs to be examined for modules
vtewari
parents: 36854
diff changeset
   586
         } else { // snmp runtime doesn't exist - initialization fails
a775e4de954f 8131061: Use of -Dcom.sun.management.snmp needs to be examined for modules
vtewari
parents: 36854
diff changeset
   587
            throw new UnsupportedOperationException("Unsupported management property: " + SNMP_PORT);
2285
37fdbed8178f 6661448: Make the SNMP agent optional when OPENJDK=true and IMPORT_BINARY_PLUGS=false
dfuchs
parents: 2
diff changeset
   588
        }
37fdbed8178f 6661448: Make the SNMP agent optional when OPENJDK=true and IMPORT_BINARY_PLUGS=false
dfuchs
parents: 2
diff changeset
   589
    }
37fdbed8178f 6661448: Make the SNMP agent optional when OPENJDK=true and IMPORT_BINARY_PLUGS=false
dfuchs
parents: 2
diff changeset
   590
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   591
    // read config file and initialize the properties
90ce3da70b43 Initial load
duke
parents:
diff changeset
   592
    private static void readConfiguration(String fname, Properties p) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   593
        if (fname == null) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   594
            String home = System.getProperty("java.home");
90ce3da70b43 Initial load
duke
parents:
diff changeset
   595
            if (home == null) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   596
                throw new Error("Can't find java.home ??");
90ce3da70b43 Initial load
duke
parents:
diff changeset
   597
            }
24969
afa6934dd8e8 8041679: Replace uses of StringBuffer with StringBuilder within core library classes
psandoz
parents: 23010
diff changeset
   598
            StringBuilder defaultFileName = new StringBuilder(home);
27565
729f9700483a 8049367: Modular Run-Time Images
chegar
parents: 26488
diff changeset
   599
            defaultFileName.append(File.separator).append("conf");
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   600
            defaultFileName.append(File.separator).append("management");
90ce3da70b43 Initial load
duke
parents:
diff changeset
   601
            defaultFileName.append(File.separator).append("management.properties");
90ce3da70b43 Initial load
duke
parents:
diff changeset
   602
            // Set file name
90ce3da70b43 Initial load
duke
parents:
diff changeset
   603
            fname = defaultFileName.toString();
90ce3da70b43 Initial load
duke
parents:
diff changeset
   604
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   605
        final File configFile = new File(fname);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   606
        if (!configFile.exists()) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   607
            error(CONFIG_FILE_NOT_FOUND, fname);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   608
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   609
90ce3da70b43 Initial load
duke
parents:
diff changeset
   610
        InputStream in = null;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   611
        try {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   612
            in = new FileInputStream(configFile);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   613
            BufferedInputStream bin = new BufferedInputStream(in);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   614
            p.load(bin);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   615
        } catch (FileNotFoundException e) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   616
            error(CONFIG_FILE_OPEN_FAILED, e.getMessage());
90ce3da70b43 Initial load
duke
parents:
diff changeset
   617
        } catch (IOException e) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   618
            error(CONFIG_FILE_OPEN_FAILED, e.getMessage());
90ce3da70b43 Initial load
duke
parents:
diff changeset
   619
        } catch (SecurityException e) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   620
            error(CONFIG_FILE_ACCESS_DENIED, fname);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   621
        } finally {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   622
            if (in != null) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   623
                try {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   624
                    in.close();
90ce3da70b43 Initial load
duke
parents:
diff changeset
   625
                } catch (IOException e) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   626
                    error(CONFIG_FILE_CLOSE_FAILED, fname);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   627
                }
15531
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents: 12694
diff changeset
   628
            }
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents: 12694
diff changeset
   629
        }
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   630
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   631
90ce3da70b43 Initial load
duke
parents:
diff changeset
   632
    public static void startAgent() throws Exception {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   633
        String prop = System.getProperty("com.sun.management.agent.class");
90ce3da70b43 Initial load
duke
parents:
diff changeset
   634
90ce3da70b43 Initial load
duke
parents:
diff changeset
   635
        // -Dcom.sun.management.agent.class not set so read management
90ce3da70b43 Initial load
duke
parents:
diff changeset
   636
        // properties and start agent
90ce3da70b43 Initial load
duke
parents:
diff changeset
   637
        if (prop == null) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   638
            // initialize management properties
90ce3da70b43 Initial load
duke
parents:
diff changeset
   639
            Properties props = getManagementProperties();
90ce3da70b43 Initial load
duke
parents:
diff changeset
   640
            if (props != null) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   641
                startAgent(props);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   642
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   643
            return;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   644
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   645
90ce3da70b43 Initial load
duke
parents:
diff changeset
   646
        // -Dcom.sun.management.agent.class=<agent classname>:<agent args>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   647
        String[] values = prop.split(":");
90ce3da70b43 Initial load
duke
parents:
diff changeset
   648
        if (values.length < 1 || values.length > 2) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   649
            error(AGENT_CLASS_INVALID, "\"" + prop + "\"");
90ce3da70b43 Initial load
duke
parents:
diff changeset
   650
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   651
        String cname = values[0];
90ce3da70b43 Initial load
duke
parents:
diff changeset
   652
        String args = (values.length == 2 ? values[1] : null);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   653
90ce3da70b43 Initial load
duke
parents:
diff changeset
   654
        if (cname == null || cname.length() == 0) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   655
            error(AGENT_CLASS_INVALID, "\"" + prop + "\"");
90ce3da70b43 Initial load
duke
parents:
diff changeset
   656
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   657
90ce3da70b43 Initial load
duke
parents:
diff changeset
   658
        if (cname != null) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   659
            try {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   660
                // Instantiate the named class.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   661
                // invoke the premain(String args) method
90ce3da70b43 Initial load
duke
parents:
diff changeset
   662
                Class<?> clz = ClassLoader.getSystemClassLoader().loadClass(cname);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   663
                Method premain = clz.getMethod("premain",
15531
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents: 12694
diff changeset
   664
                        new Class<?>[]{String.class});
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   665
                premain.invoke(null, /* static */
15531
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents: 12694
diff changeset
   666
                        new Object[]{args});
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   667
            } catch (ClassNotFoundException ex) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   668
                error(AGENT_CLASS_NOT_FOUND, "\"" + cname + "\"");
90ce3da70b43 Initial load
duke
parents:
diff changeset
   669
            } catch (NoSuchMethodException ex) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   670
                error(AGENT_CLASS_PREMAIN_NOT_FOUND, "\"" + cname + "\"");
90ce3da70b43 Initial load
duke
parents:
diff changeset
   671
            } catch (SecurityException ex) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   672
                error(AGENT_CLASS_ACCESS_DENIED);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   673
            } catch (Exception ex) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   674
                String msg = (ex.getCause() == null
15531
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents: 12694
diff changeset
   675
                        ? ex.getMessage()
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents: 12694
diff changeset
   676
                        : ex.getCause().getMessage());
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   677
                error(AGENT_CLASS_FAILED, msg);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   678
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   679
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   680
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   681
90ce3da70b43 Initial load
duke
parents:
diff changeset
   682
    public static void error(String key) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   683
        String keyText = getText(key);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   684
        System.err.print(getText("agent.err.error") + ": " + keyText);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   685
        throw new RuntimeException(keyText);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   686
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   687
90ce3da70b43 Initial load
duke
parents:
diff changeset
   688
    public static void error(String key, String message) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   689
        String keyText = getText(key);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   690
        System.err.print(getText("agent.err.error") + ": " + keyText);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   691
        System.err.println(": " + message);
24980
dbf4ae2cafa4 8046778: Better error messages when starting JMX agent via attach or jcmd
sla
parents: 24969
diff changeset
   692
        throw new RuntimeException(keyText + ": " + message);
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   693
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   694
90ce3da70b43 Initial load
duke
parents:
diff changeset
   695
    public static void error(Exception e) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   696
        e.printStackTrace();
90ce3da70b43 Initial load
duke
parents:
diff changeset
   697
        System.err.println(getText(AGENT_EXCEPTION) + ": " + e.toString());
90ce3da70b43 Initial load
duke
parents:
diff changeset
   698
        throw new RuntimeException(e);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   699
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   700
45009
c39425655469 8177721: Improve diagnostics in sun.management.Agent#startAgent()
shshahma
parents: 43719
diff changeset
   701
    public static void error(AgentConfigurationError e) {
c39425655469 8177721: Improve diagnostics in sun.management.Agent#startAgent()
shshahma
parents: 43719
diff changeset
   702
        String keyText = getText(e.getError());
c39425655469 8177721: Improve diagnostics in sun.management.Agent#startAgent()
shshahma
parents: 43719
diff changeset
   703
        String[] params = e.getParams();
c39425655469 8177721: Improve diagnostics in sun.management.Agent#startAgent()
shshahma
parents: 43719
diff changeset
   704
c39425655469 8177721: Improve diagnostics in sun.management.Agent#startAgent()
shshahma
parents: 43719
diff changeset
   705
        System.err.print(getText("agent.err.error") + ": " + keyText);
c39425655469 8177721: Improve diagnostics in sun.management.Agent#startAgent()
shshahma
parents: 43719
diff changeset
   706
c39425655469 8177721: Improve diagnostics in sun.management.Agent#startAgent()
shshahma
parents: 43719
diff changeset
   707
        if (params != null && params.length != 0) {
c39425655469 8177721: Improve diagnostics in sun.management.Agent#startAgent()
shshahma
parents: 43719
diff changeset
   708
           StringBuffer message = new StringBuffer(params[0]);
c39425655469 8177721: Improve diagnostics in sun.management.Agent#startAgent()
shshahma
parents: 43719
diff changeset
   709
           for (int i = 1; i < params.length; i++) {
c39425655469 8177721: Improve diagnostics in sun.management.Agent#startAgent()
shshahma
parents: 43719
diff changeset
   710
               message.append(" " + params[i]);
c39425655469 8177721: Improve diagnostics in sun.management.Agent#startAgent()
shshahma
parents: 43719
diff changeset
   711
           }
c39425655469 8177721: Improve diagnostics in sun.management.Agent#startAgent()
shshahma
parents: 43719
diff changeset
   712
           System.err.println(": " + message);
c39425655469 8177721: Improve diagnostics in sun.management.Agent#startAgent()
shshahma
parents: 43719
diff changeset
   713
        }
c39425655469 8177721: Improve diagnostics in sun.management.Agent#startAgent()
shshahma
parents: 43719
diff changeset
   714
        e.printStackTrace();
c39425655469 8177721: Improve diagnostics in sun.management.Agent#startAgent()
shshahma
parents: 43719
diff changeset
   715
        throw new RuntimeException(e);
c39425655469 8177721: Improve diagnostics in sun.management.Agent#startAgent()
shshahma
parents: 43719
diff changeset
   716
    }
c39425655469 8177721: Improve diagnostics in sun.management.Agent#startAgent()
shshahma
parents: 43719
diff changeset
   717
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   718
    public static void warning(String key, String message) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   719
        System.err.print(getText("agent.err.warning") + ": " + getText(key));
90ce3da70b43 Initial load
duke
parents:
diff changeset
   720
        System.err.println(": " + message);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   721
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   722
90ce3da70b43 Initial load
duke
parents:
diff changeset
   723
    private static void initResource() {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   724
        try {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   725
            messageRB =
43494
11801b2ff456 8173608: Separate JDK management agent from java.management module
mchung
parents: 40743
diff changeset
   726
                ResourceBundle.getBundle("jdk.internal.agent.resources.agent");
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   727
        } catch (MissingResourceException e) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   728
            throw new Error("Fatal: Resource for management agent is missing");
90ce3da70b43 Initial load
duke
parents:
diff changeset
   729
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   730
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   731
90ce3da70b43 Initial load
duke
parents:
diff changeset
   732
    public static String getText(String key) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   733
        if (messageRB == null) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   734
            initResource();
90ce3da70b43 Initial load
duke
parents:
diff changeset
   735
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   736
        try {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   737
            return messageRB.getString(key);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   738
        } catch (MissingResourceException e) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   739
            return "Missing management agent resource bundle: key = \"" + key + "\"";
90ce3da70b43 Initial load
duke
parents:
diff changeset
   740
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   741
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   742
90ce3da70b43 Initial load
duke
parents:
diff changeset
   743
    public static String getText(String key, String... args) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   744
        if (messageRB == null) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   745
            initResource();
90ce3da70b43 Initial load
duke
parents:
diff changeset
   746
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   747
        String format = messageRB.getString(key);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   748
        if (format == null) {
15531
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents: 12694
diff changeset
   749
            format = "missing resource key: key = \"" + key + "\", "
071efc9f31ad 8002048: Protocol to discovery of manageable Java processes on a network
dsamersoff
parents: 12694
diff changeset
   750
                    + "arguments = \"{0}\", \"{1}\", \"{2}\"";
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   751
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   752
        return MessageFormat.format(format, (Object[]) args);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   753
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   754
}