Thank you for your example.
I would like the standard API (ot at least som hotspot specific API, like com.sun.management.UnixOperatingSystemMXBean) to let my app self-describe its network activity

A JMX approach will be really simple to use, but other solutions will be welcome

The API Socket.setSocketImplFactory lets you to intercept every SocketImpl creation but actually it is not so useful because there is no way to create the original impl provided by the platform (PlainSocketImpl is package protected, inside java.net package)

for example I would like to write my factory:

public static class MonitorSocketImplFactory implements java.net.SocketImplFactory {

        @Override
        public SocketImpl createSocketImpl() {
            SocketImpl socketImpl = ....create platform soccketimpl.....
            return new MyMonitoredSocketImpl(socketImpl);
        }
    }

(another little issue: looking inside the jdk7 implementation java.net.Socket I see that sometimes Socket.factory is not called to create the SocketImpl (as for SocksSocketImpl))

IMHO It would be useful to give a "java.net.SystemSocketImplFactory" that essentially creates the standard SocketImpl for the platform

or in class java.net.Socket {
...
public static SocketImplFactory getSystemSocketImplFactory { return ... implementation specific class.... }
....
}

- Enrico


Il 03/05/2013 23:34, Thomas Darimont ha scritto:
Hello Enrico,

I know that this is not JDK 8 specific but I think it solves your problem:

One way to do this in a portable way would be to use the byteman instrumentation
tool from JBoss: http://www.jboss.org/byteman

Byteman provides a rule language for bytecode manipulation via a custom javaagent
and allows to instrument jdk classes.

So if you want to monitor sockets you could write rules like this:

RULE Socket monitor connect event
CLASS ^java.net.Socket
METHOD connect(SocketAddress, int)
AT EXIT
IF TRUE
DO de.tutorials.training.net.SimpleSocketInspector.INSTANCE.beginTracking($0)
ENDRULE

RULE Socket monitor close event
CLASS ^java.net.Socket
METHOD close()
AT CALL close
IF TRUE
DO de.tutorials.training.net.SimpleSocketInspector.INSTANCE.endTracking($0)
ENDRULE

$0 means the "this" reference.

In this example I exposed the socket monitoring information as a jmx mbean for inspection (within de.tutorials.training.net.SimpleSocketInspector.INSTANCE) accessible via visualvm.

I hacked a quick prototype for this that works quite well :)

This allows you to track Socket connect and close "events". If you want to track activity for the individual sockets - you could instrument the Socket.getOutputStream() / .getInputStream() Methods
and return an appropriate wrapper that overrides the read(byte[],int,int)
and write(byte[],int,int) methods in which you could maintain the "latest socket activity timestamp" information.

HTH

Best regards,
Thomas


2013/5/3 Enrico Olivelli <eolive...@gmail.com <mailto:eolive...@gmail.com>>

    Il 02/05/2013 22:44, Alan Bateman ha scritto:

        On 02/05/2013 20:35, Enrico Olivelli wrote:

            Hi,
            In jdk7 there is no way to ask the jvm for the list of
            actually active
            sockets, witout jni or any other native non-portable solution.
            Is there any plan to add a jmx set of beans to monitor jvm
            network
            activity  in a portable manner?
            Thanks
            Enrico

        I don't know which operating system you are on but the JDK has
        a platform-specific management interface named
        com.sun.management.UnixOperatingSystemMXBean that allows the
        number of open file descriptors to be monitored. This isn't
        enumerating the open sockets so it might not be want you want.
        Personally I would use lsof or /proc to look at the target VM
        for information like this.

        -Alan.

    For Unix deployments I use lsof too but is not a portable solution
    and I don't like my JVM to start external processes to look inside
    itself
    As you said UnixOperatingSystemMXBean  is useful only to get the
    number of open FD
    I would like a standard facility to list all open sockets, at least:
    - endpoint addresses (local address and port and remote address
    and port)
    - connection status (ESTABLISHED, TIME_WAIT....)
    - timestamp of creation...
    - timestamp of last activity ?

    thanks
    Enrico





Reply via email to