Skip to content

Commit

Permalink
Merge pull request #1 from luke-powers/master
Browse files Browse the repository at this point in the history
updating python mondemand with performance traces and annotations
  • Loading branch information
djnym authored Oct 25, 2016
2 parents 5bf4f8c + 40a086e commit 4ebbd90
Show file tree
Hide file tree
Showing 8 changed files with 226 additions and 5,406 deletions.
27 changes: 27 additions & 0 deletions LICENSE
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
Copyright (c) 2016, OpenX.com
All rights reserved.

Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:

* Redistributions of source code must retain the above copyright notice, this
list of conditions and the following disclaimer.

* Redistributions in binary form must reproduce the above copyright notice,
this list of conditions and the following disclaimer in the documentation
and/or other materials provided with the distribution.

* Neither the name of the copyright holder nor the names of its
contributors may be used to endorse or promote products derived from
this software without specific prior written permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
35 changes: 30 additions & 5 deletions Makefile
Original file line number Diff line number Diff line change
@@ -1,10 +1,35 @@
PKG_CONFIG_PATH=/usr/lib/pkgconfig
SWIG_EXE=/usr/local/bin/swig
CFLAGS=`PKG_CONFIG_PATH=/usr/lib/pkgconfig pkg-config mondemand-4.0 --cflags`
LIBS=`PKG_CONFIG_PATH=/usr/lib/pkgconfig pkg-config mondemand-4.0 --libs`
PYFLAGS=`python-config --includes`
PYSITE_PACKAGES=`python -c "from distutils.sysconfig import get_python_lib; print(get_python_lib())"`
all:
/opt/bin/swig -python mondemand.i
gcc -fPIC $(CFLAGS) -I/opt/include/python2.6 -c mondemand_wrap.c
gcc -shared mondemand_wrap.o -o _mondemand.so $(LIBS)
BUILD_DIR=build
LIB_NAME=mondemand
RMFLAGS='-rvf'
.PHONY: directories
all: build
build: directories
@echo "Building mondemand swig python wrapper."
@$(SWIG_EXE) -module mondemand -python mondemand.i
@mv mondemand.py $(BUILD_DIR)/$(LIB_NAME)/__init__.py
@gcc -fPIC $(CFLAGS) $(PYFLAGS) -c mondemand_wrap.c
@gcc -shared mondemand_wrap.o -o $(BUILD_DIR)/$(LIB_NAME)/_mondemand.so $(LIBS)
install:
@echo "Installing mondemand python client."
@echo "$(BUILD_DIR)/$(LIB_NAME) to $(PYSITE_PACKAGES)"
@if [ -d $(BUILD_DIR)/$(LIB_NAME) ]; then mv $(BUILD_DIR)/$(LIB_NAME)/ $(PYSITE_PACKAGES); \
else echo "No build found"; fi;
directories:
@mkdir -p $(BUILD_DIR)/$(LIB_NAME)
clean:
rm -rf *.o *.so mondemand.py *.pyc *_wrap.c
@rm $(RMFLAGS) *.o *.so mondemand.py *.pyc *_wrap.c
@if [ -d $(BUILD_DIR)/$(LIB_NAME) ]; then rm $(RMFLAGS) $(BUILD_DIR)/$(LIB_NAME); fi;
@if [ -d $(BUILD_DIR) ]; then rm $(RMFLAGS) build; fi;
uninstall: clean
@echo "removing mondemand python client."
@if [ -d $(PYSITE_PACKAGES)/$(LIB_NAME) ]; then rm $(RMFLAGS) $(PYSITE_PACKAGES)/$(LIB_NAME); \
else echo "No install found"; fi;
24 changes: 24 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@

REQUIREMENTS
============
* [mondemand library](https://github.com/mondemand/mondemand)
* [lwes library](https://github.com/lwes)
* [swig](https://github.com/swig/swig)

INSTALL
=======

Run `make` and `make install`.

Example Run
===========

Start lwes-event-printing-listener to echo out all data that the lwes
receives from the mondemand client.

```shell
lwes-event-printing-listener -m 0.0.0.0 -p 42042
python demo.py
```

Investigate demo.py for more examples.
13 changes: 8 additions & 5 deletions demo.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,19 +2,22 @@

# create the client
client = mondemand.client_create("python_client")

# create a transport to send data
transport = mondemand.transport_lwes_create("10.1.37.27", 20402, None, 0, 60)
transport = mondemand.transport_lwes_create("127.0.0.1", 25552, None, 0, 60)

# attach the transport to the client
mondemand.add_transport(client, transport)

# add some contextual information to the client
mondemand.set_context(client, "cluster_id", "12345")

# log some stats
mondemand.stats_set(client, "filename.py", 1, "stat_1", 1234)
mondemand.stats_inc(client, "filename.py", 1, "stat_2", 1)
# set some stats
mondemand.stats_set(client, "demo.py", 1, "stat_1", 1234)
mondemand.stats_inc(client, "demo.py", 1, "stat_2", 1)

# send it to the network
mondemand.flush(client)

# send some annotations
mondemand.flush_annotation('', 1234567890, 'test', 'test desc', [], 0, client)
72 changes: 72 additions & 0 deletions mondemand.i
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
%module mondemand
%feature("autodoc", "1");
%{
#include "mondemand.h"
#define MONDEMAND_UNKNOWN 0
Expand All @@ -10,6 +11,36 @@
typedef long long MStatCounter;
%}

// This tells SWIG to treat char ** as a special case, needed for the
// char ** in flush_annotations. See goo.gl/EfhRZr
%typemap(in) char ** {
/* Check if is a list */
if (PyList_Check($input)) {
int size = PyList_Size($input);
int i = 0;
$1 = (char **) malloc((size+1)*sizeof(char *));
for (i = 0; i < size; i++) {
PyObject *o = PyList_GetItem($input,i);
if (PyString_Check(o))
$1[i] = PyString_AsString(PyList_GetItem($input,i));
else {
PyErr_SetString(PyExc_TypeError,"list must contain strings");
free($1);
return NULL;
}
}
$1[i] = 0;
} else {
PyErr_SetString(PyExc_TypeError,"not a list");
return NULL;
}
}

// This cleans up the char ** array we malloc'd before the function call
%typemap(freearg) char ** {
free((char *) $1);
}

%inline %{

struct mondemand_client *
Expand Down Expand Up @@ -207,4 +238,45 @@ stats_set(struct mondemand_client *client, const char *filename,
MONDEMAND_SET, MONDEMAND_GAUGE, key, value);
}

int
initialize_performance_trace (struct mondemand_client *client,
const char *id,
const char *caller_label)
{
return mondemand_initialize_performance_trace(client, id, caller_label);
}

int
add_performance_trace_timing (struct mondemand_client *client,
const char *label,
const long long int start,
const long long int end)
{
return mondemand_add_performance_trace_timing(client, label, start, end);
}

void
clear_performance_trace (struct mondemand_client *client)
{
return mondemand_clear_performance_trace(client);
}

int
flush_performance_trace(struct mondemand_client *client)
{
return mondemand_flush_performance_trace(client);
}

int
flush_annotation (const char* id,
const long long int timestamp,
const char* description,
const char* text,
const char** tags,
const int num_tags,
struct mondemand_client *client)
{
return mondemand_flush_annotation(id, timestamp, description, text, tags, num_tags, client);
}

%}
Loading

0 comments on commit 4ebbd90

Please sign in to comment.