Versioner sammenlignet

Nøgle

  • Linjen blev tilføjet.
  • Denne linje blev fjernet.
  • Formatering blev ændret.

Status
colourRed
titleDraft

A possible way to Log User- and Page-Access to statsd is via the Event system - using Adaptavist's Scriptrunner for Confluence, se https://scriptrunner.adaptavist.com/latest/confluence/ConfluenceEventHandlers.html#_collecting_stats

Read Access Logging in Confluence for good reasons to log via the Event system.

 

Tip

To make this work, the jar file from https://github.com/datadog/java-dogstatsd-client#java-dogstatsd-client must be placed under confluence/WEB-INF/lib and Confluence must be restarted. This will load the jar file into the Tomcat.

 

 

The script is executed by an Event Handler in Confluence:

Image RemovedImage Added

this executes this script for every PageViewEvent:

Kodeblok
languagegroovy
titlepost.groovy
import com.atlassian.confluence.user.AuthenticatedUserThreadLocal
import com.atlassian.confluence.user.*;
import com.atlassian.confluence.pages.Page
import com.atlassian.confluence.pages.PageManager
import com.atlassian.confluence.spaces.Space
import com.atlassian.confluence.spaces.SpaceManager
import com.atlassian.sal.api.component.ComponentLocator
import com.atlassian.confluence.event.events.content.page.*
import groovy.transform.Field
import javacom.timgroup.netstatsd.InetAddressStatsDClient;
import javacom.net.DatagramPacket

System.out.println("Start post2splunk.groovy")timgroup.statsd.NonBlockingStatsDClient;

def spaceManager = ComponentLocator.getComponent(SpaceManager)
def pageManager = ComponentLocator.getComponent(PageManager)

String userName="Anonymous"
def currentUser = AuthenticatedUserThreadLocal.get()
if (currentUser)
{
  userName=(String)currentUser.name
}

//System.out.println("Step 1 post2splunk.groovyStart...")

def event = event as PageEvent
//String eventType=(String)event.toString()
//eventType=eventType.replaceAll("com.atlassian.confluence.event.events.content.page.","")
//eventType=eventType.substring(0, eventType.indexOf('@'))
//eventType=eventType.replaceAll("Event","")

// keys to create unique nodes for counters
// https://docs.atlassian.com/confluence/5.9.7/com/atlassian/confluence/pages/Page.html

System.out.println("Step 2 post2splunk.groovy")

@Field final def host = "127.0.0.1"
@Field final def port = 8125

//String spaceKey = event.page.getSpace().getKey()
//String pageId = event.page.getIdAsString()
//String pageName = event.page.getTitle()
// keys to create unique nodes for counters
def spaceKey = event.page.spaceKey
def pageId = event.page.id as String

//def userKey = currentUser.name
def nodeId = "confluence.stats.views"

// build the unique metric keys
def pageViewMetricKey = "${nodeId}.page.${pageId}"
def spaceViewMetricKey = "${nodeId}.space.System.out.println("Posting.....")

String[] tags = ["user:${userName}", "space:${spaceKey}"
def userViewMetricKey = "${nodeId}.user.${userName}.${, "user:${pageId}"]


System.out.println("Step 3 post2splunk.groovy")

// increase by one the counters for the following metric keys
increaseByOne(pageViewMetricKey, userViewMetricKey, spaceViewMetricKey)

def increaseByOne(String... keys) {
    def dataToSend = ""
    def value = 1 //increase counter by one

    StatsDClient statsdpage = new NonBlockingStatsDClient("confluence.stats.views","localhost",8125,tags);
statsdpage.incrementCounter("page");
 
try
{
  //System.out.println("Step 4 post2splunk.groovyClosing socket");

    //syntax for counter according to https://github.com/etsy/statsd/blob/master/docs/metric_types.md
    for (key in keys) {
        dataToSend += "${key}:${value}|c\n"
    }

    statsdpage.stop();
}
catch(Exception ex) {
  //System.out.println("StepCatching 5the post2splunk.groovyexception");

    def data = dataToSend.getBytes()
    //def address = InetAddress.getByName(host as String)
    def address = InetAddress.getLocalHost();
    def packet = new DatagramPacket(data, data.length, address, port as int)
    def socket = new DatagramSocket()
    try {
        System.out.println("Step 6 post2splunk.groovy")
        socket.send(packet)
    } finally {
        System.out.println("Step 7 post2splunk.groovy")
        socket.close()
    }
}

System.out.println("End post2splunk.groovy")
}

//System.out.println("End......")

Viewing the data in DataDog - here its all Page Views pr. Space:

Image Added

Or tracking a single User pr. Space:

Image Added

Finally - vice versa - Monitoring a single Space for PageViews pr. User:

Image Added

 

Advarsel

For some reason, this kills the Confluence Tomcat with "java.io.IOException: Too many open files", so my best guess is that the script is not releasing some resources. Raising limits has not helped...

Kodeblok
12-Mar-2017 10:39:30.087 SEVERE [http-nio-8090-Acceptor-0] org.apache.tomcat.util.net.NioEndpoint$Acceptor.run Socket accept failed
 java.io.IOException: Too many open files
	at sun.nio.ch.ServerSocketChannelImpl.accept0(Native Method)
	at sun.nio.ch.ServerSocketChannelImpl.accept(ServerSocketChannelImpl.java:422)
	at sun.nio.ch.ServerSocketChannelImpl.accept(ServerSocketChannelImpl.java:250)
	at org.apache.tomcat.util.net.NioEndpoint$Acceptor.run(NioEndpoint.java:682)
	at java.lang.Thread.run(Thread.java:745)