Skip to content
This repository has been archived by the owner on Feb 22, 2022. It is now read-only.

Build status updates: 3.10 stable #42

Open
wants to merge 39 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
39 commits
Select commit Hold shift + click to select a range
8ab3142
Travis for NewRelic HHVM
absalomedia Oct 9, 2015
cb60170
Fix Travis typo
absalomedia Oct 9, 2015
d5b9169
Try to copy NewRelic libs
absalomedia Oct 9, 2015
d39f6a6
Drop build script cos Windows on a Friday
absalomedia Oct 9, 2015
40fe806
HHVM version checks for Travis
absalomedia Oct 9, 2015
a6efc9a
Redesign errors
absalomedia Oct 12, 2015
16e1c74
Docker test run
absalomedia Oct 13, 2015
583c1f8
Remove Travis based HHVM. See if Docker HHVM detects
absalomedia Oct 13, 2015
31cd3fa
More docker HHVM work
absalomedia Oct 13, 2015
4eb9077
More Docker work
absalomedia Oct 13, 2015
64ad065
More Docker work
absalomedia Oct 13, 2015
db5603d
See what docker is doing
absalomedia Oct 13, 2015
bd630d6
Fix typos on trying to get info
absalomedia Oct 13, 2015
c8c3640
Force build by tweaking doco
absalomedia Oct 13, 2015
446ac47
Simplified Travis
absalomedia Oct 13, 2015
0772507
Try to fire up the HHVM image
absalomedia Oct 13, 2015
4d51cbd
Build instead of pull
absalomedia Oct 13, 2015
fa30c60
Refactor docker in Travis. See if it works
absalomedia Oct 13, 2015
c095add
More typo fixes
absalomedia Oct 13, 2015
24f8275
Fix more typos
absalomedia Oct 13, 2015
70ca0ae
Getting closer to docker run
absalomedia Oct 13, 2015
a793b84
See if Travis allows me sh access to Docker
absalomedia Oct 13, 2015
15d94a8
More Travis / Docker work
absalomedia Oct 13, 2015
5db1def
Let's see what this does
absalomedia Oct 13, 2015
6b201fc
Test Dockerfile
absalomedia Oct 14, 2015
4415cf0
Restructure dockerfile to see if wget works
absalomedia Oct 14, 2015
b94a94e
More work on Docker file
absalomedia Oct 14, 2015
e0dc92b
See what this does
absalomedia Oct 14, 2015
d30b7b1
Fix typo
absalomedia Oct 14, 2015
808f090
More Docker work
absalomedia Oct 14, 2015
f9a8b15
More restructuring
absalomedia Oct 14, 2015
23192a9
Better NR build sequence in Docker
absalomedia Oct 14, 2015
626d2b6
Really simple Travis
absalomedia Oct 14, 2015
cf55291
Add in Travis status
absalomedia Oct 14, 2015
ab7746f
Markdown status
absalomedia Oct 14, 2015
66dc556
Hopeful HHVM 3.10 compliance, various sideports & updates taken from …
absalomedia Dec 7, 2015
f780521
Typo fix
absalomedia Dec 7, 2015
a668947
Partial refactor test for 3.10
absalomedia Dec 7, 2015
c18495d
Better build sequence for 3.10
absalomedia Dec 7, 2015
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
24 changes: 24 additions & 0 deletions .travis.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
sudo: required

services:
- docker

compiler:
- gcc

group: edge

before_install:
- docker pull absalomedia/hhvm-newrelic-ext
- docker ps -a
- docker info

script:
- docker build -t absalomedia/hhvm-newrelic-ext .

notifications:
on_success: never
on_failure: never

os:
- linux
27 changes: 27 additions & 0 deletions Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
FROM absalomedia/hhvm-dev

MAINTAINER Lawrence Meckan <[email protected]>

RUN apt-get update \
&& apt-get -y install wget curl unzip git \
&& apt-get -y upgrade \
&& apt-get -y autoremove \
&& apt-get -y clean \
&& rm -rf /tmp/* /var/tmp/*

RUN mkdir -p /usr/src/newrelic && \
cd /usr/src/newrelic
RUN echo "Downloading New Relic SDK ..." && wget https://download.newrelic.com/agent_sdk/nr_agent_sdk-v0.16.1.0-beta.x86_64.tar.gz
RUN tar -xzf nr_agent_sdk-*.tar.gz
RUN cp nr_agent_sdk-*/include/* /usr/local/include/ && \
cp nr_agent_sdk-*/lib/* /usr/local/lib/
RUN export CXX="g++-4.9"

WORKDIR /usr/src

RUN git clone https://github.com/absalomedia/hhvm-newrelic-ext.git && \
cd hhvm-newrelic-ext && \
hphpize && \
cmake . && \
make && \
make install
6 changes: 5 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
# (Unofficial) New Relic extension for HHVM

[![Build Status](https://travis-ci.org/absalomedia/hhvm-newrelic-ext.svg?branch=master)](https://travis-ci.org/absalomedia/hhvm-newrelic-ext)

This is an unofficial New Relic extension for [HHVM](http://hhvm.com/) which implements the [New Relic PHP agent API](https://docs.newrelic.com/docs/agents/php-agent/configuration/php-agent-api) as much as possible.

It's build on the [New Relic SDK agent](https://docs.newrelic.com/docs/agents/agent-sdk/using-agent-sdk/getting-started-agent-sdk), which doesn't support all the features needed for rebuilding the PHP agent API and has some other caveats
Expand Down Expand Up @@ -61,6 +63,8 @@ For compiling the extension, you need the dev package as well, eg. on Ubuntu/Deb
sudo apt-get install hhvm-dev
```

There are known issues on Ubuntu 12.04 and Debian Wheezy

### Compile the extension

```
Expand Down Expand Up @@ -94,7 +98,7 @@ When you use the PHP agent of New Relic, you're certainly used to have function

* You have to explicitely enable it
* It slows down your request by factor 2 or more
* It can only show up to 2'000 function calls
* It can only show up to 2000 function calls
* If you use an unpatched HHVM 3.5 or less (fixed in HHVM 3.6), it's even slower

### Enabling Function Level Profiling
Expand Down
33 changes: 26 additions & 7 deletions ext_newrelic.php
Original file line number Diff line number Diff line change
Expand Up @@ -124,8 +124,16 @@ static function endAll(): void {
}

static function errorCallback($type, $message, $c) {
$errno = $errno & error_reporting();
if($errno == 0) return false;
switch($type)
{
case E_WARNING: // 2 //
case E_NOTICE: // 8 //
case E_USER_NOTICE: // 1024 //
case E_STRICT: // 2048 //
case E_DEPRECATED: // 8192 //
case E_USER_DEPRECATED: // 16384 //
return false;
}

$exception_type = self::friendlyErrorType($type);
$error_message = $message;
Expand Down Expand Up @@ -321,6 +329,17 @@ function newrelic_pdo_intercept() {
});
}

function newrelic_db_start($query) {
$a = _newrelic_parse_query($query);
return newrelic_segment_datastore_begin($a[1], $a[0], $query);
}

function newrelic_db_end($newrelic_segment) {
if (isset($newrelic_segment) && $newrelic_segment) {
newrelic_segment_end($newrelic_segment);
}
}

// mysqli
function newrelic_mysqli_intercept() {
fb_intercept('mysqli::hh_real_query', function ($name, $obj, $args, $data, &$done) {
Expand Down Expand Up @@ -365,7 +384,7 @@ function newrelic_file_get_contents_intercept() {

// fread and fwrite (e.g. Redis)
function newrelic_fread(resource $handle, int $length) {
if (stream_get_meta_data($handle)['wrapper_type'] != 'plainfile') {
if (empty(stream_get_meta_data($handle)['uri']) && stream_get_meta_data($handle)['wrapper_type'] != 'plainfile') {
$seg = newrelic_segment_external_begin('sock_read[' . stream_socket_get_name($handle,true) . ']', 'fread');
} else {
$seg = newrelic_segment_external_begin('file', 'fread');
Expand All @@ -376,7 +395,7 @@ function newrelic_fread(resource $handle, int $length) {
}

function newrelic_fwrite( resource $handle, string $string, int $length = -1 ) {
if (stream_get_meta_data($handle)['wrapper_type'] != 'plainfile') {
if (empty(stream_get_meta_data($handle)['uri']) && stream_get_meta_data($handle)['wrapper_type'] != 'plainfile') {
$seg = newrelic_segment_external_begin('sock_write[' . stream_socket_get_name($handle,true) . ']', 'fwrite');
} else {
$seg = newrelic_segment_external_begin('file', 'fwrite');
Expand Down Expand Up @@ -411,7 +430,7 @@ function newrelic_curl_intercept() {

// socket_read and socket_write (e.g. MongoDB (mongofill))
function newrelic_socket_read(resource $socket, int $length, int $type = PHP_BINARY_READ) {
if (stream_get_meta_data($socket)['wrapper_type'] != 'plainfile') {
if (empty(stream_get_meta_data($handle)['uri']) && stream_get_meta_data($socket)['wrapper_type'] != 'plainfile') {
$seg = newrelic_segment_external_begin('sock_read[' . stream_socket_get_name($socket,true) . ']', 'socket_read');
} else {
$seg = newrelic_segment_external_begin('file', 'socket_read');
Expand All @@ -422,7 +441,7 @@ function newrelic_socket_read(resource $socket, int $length, int $type = PHP_BIN
}

function newrelic_socket_write( resource $socket, string $string, int $length = 0 ) {
if (stream_get_meta_data($socket)['wrapper_type'] != 'plainfile') {
if (empty(stream_get_meta_data($handle)['uri']) && stream_get_meta_data($socket)['wrapper_type'] != 'plainfile') {
$seg = newrelic_segment_external_begin('sock_write[' . stream_socket_get_name($socket,true) . ']', 'socket_write');
} else {
$seg = newrelic_segment_external_begin('file', 'socket_write');
Expand All @@ -433,7 +452,7 @@ function newrelic_socket_write( resource $socket, string $string, int $length =
}

function newrelic_socket_recv( resource $socket , &$buf , int $len , int $flags ) {
if (stream_get_meta_data($socket)['wrapper_type'] != 'plainfile') {
if (empty(stream_get_meta_data($handle)['uri']) && stream_get_meta_data($socket)['wrapper_type'] != 'plainfile') {
$seg = newrelic_segment_external_begin('sock_read[' . stream_socket_get_name($socket,true) . ']', 'socket_read');
} else {
$seg = newrelic_segment_external_begin('file', 'socket_read');
Expand Down
32 changes: 20 additions & 12 deletions newrelic.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -164,34 +164,39 @@ static void HHVM_FUNCTION(newrelic_set_external_profiler, int64_t maxdepth ) {
}

static Variant HHVM_FUNCTION(newrelic_get_scoped_generic_segment, const String & name) {
ScopedGenericSegment * segment = nullptr;
// NEWOBJ existsonly until HHVM 3.4
#ifdef NEWOBJ
segment = NEWOBJ(ScopedGenericSegment)(name.c_str());
#else
segment = newres<ScopedGenericSegment>(name.c_str());
#if defined NEWOBJ
auto segment = NEWOBJ(ScopedGenericSegment)(name.c_str());
// newres exists only until HHVM 3.10.0
#elif defined newres
auto segment = newres<ScopedGenericSegment>(name.c_str());
#else
auto segment = req::make<ScopedGenericSegment>(name.c_str());
#endif
return Resource(segment);
}

static Variant HHVM_FUNCTION(newrelic_get_scoped_database_segment, const String & table, const String & operation, const String & sql, const String & sql_trace_rollup_name) {
ScopedDatastoreSegment * segment = nullptr;
// NEWOBJ existsonly until HHVM 3.4
#ifdef NEWOBJ
segment = NEWOBJ(ScopedDatastoreSegment)(table.c_str(), operation.c_str(), sql.c_str(), sql_trace_rollup_name.c_str());
auto segment = NEWOBJ(ScopedDatastoreSegment)(table.c_str(), operation.c_str(), sql.c_str(), sql_trace_rollup_name.c_str());
// newres exists only until HHVM 3.10
#elif defined newres
auto segment = newres<ScopedDatastoreSegment>(table.c_str(), operation.c_str(), sql.c_str(), sql_trace_rollup_name.c_str());
#else
segment = newres<ScopedDatastoreSegment>(table.c_str(), operation.c_str(), sql.c_str(), sql_trace_rollup_name.c_str());
auto segment = req::make<ScopedDatastoreSegment>(table.c_str(), operation.c_str(), sql.c_str(), sql_trace_rollup_name.c_str());
#endif
return Resource(segment);
}

static Variant HHVM_FUNCTION(newrelic_get_scoped_external_segment, const String & host, const String & name) {
ScopedExternalSegment * segment = nullptr;
// NEWOBJ existsonly until HHVM 3.4
#ifdef NEWOBJ
segment = NEWOBJ(ScopedExternalSegment)(host.c_str(), name.c_str());
auto segment = NEWOBJ(ScopedExternalSegment)(host.c_str(), name.c_str());
// newres exists only until HHVM 3.10
#elif defined newres
auto segment = newres<ScopedExternalSegment>(host.c_str(), name.c_str());
#else
segment = newres<ScopedExternalSegment>(host.c_str(), name.c_str());
auto segment = req::make<ScopedExternalSegment>(host.c_str(), name.c_str());
#endif
return Resource(segment);
}
Expand All @@ -217,6 +222,7 @@ static class NewRelicExtension : public Extension {
app_name = RuntimeOption::EnvVariables["NEWRELIC_APP_NAME"];
app_language = RuntimeOption::EnvVariables["NEWRELIC_APP_LANGUAGE"];
app_language_version = RuntimeOption::EnvVariables["NEWRELIC_APP_LANGUAGE_VERSION"];
log_properties_file = RuntimeOption::EnvVariables["NEWRELIC_LOG_PROPERTIES_FILE"];

if (app_language.empty()) {
app_language = "php-hhvm";
Expand All @@ -231,6 +237,7 @@ static class NewRelicExtension : public Extension {
setenv("NEWRELIC_APP_NAME", app_name.c_str(), 1);
setenv("NEWRELIC_APP_LANGUAGE", app_language.c_str(), 1);
setenv("NEWRELIC_APP_LANGUAGE_VERSION", app_language_version.c_str(), 1);
setenv("NEWRELIC_LOG_PROPERTIES_FILE", log_properties_file.c_str(), 1);

if (!license_key.empty() && !app_name.empty() && !app_language.empty() && !app_language_version.empty())
config_loaded = true;
Expand Down Expand Up @@ -335,6 +342,7 @@ static class NewRelicExtension : public Extension {
std::string app_name;
std::string app_language;
std::string app_language_version;
std::string log_properties_file;
bool config_loaded;
} s_newrelic_extension;

Expand Down
3 changes: 3 additions & 0 deletions newrelic_profiler.h
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,9 @@ namespace HPHP {
//virtual Frame *allocateFrame() override;
private:

void vscan(IMarker& mark) const override {
}

class NewRelicProfilerFrame : public Frame {
public:
virtual ~NewRelicProfilerFrame() {
Expand Down