Exemple #1
0
def create_app():
    app = Flask(__name__)
    agent = Agent()
    agent.instrument(app)

    @app.route('/', methods=['POST'])
    def hello():
        request_data = request.get_json()
        name = request_data['name']

        user_id = insert_user(name)

        res_body = {'id': user_id, 'message': f'Hello {name}'}

        stream = request.args.get('stream')
        if stream == 'true':
            # Send the response as stream
            return Response(stream_body(json.dumps(res_body)),
                            mimetype='application/json')
        else:
            # Send the entire response
            response = make_response(jsonify(res_body))
            response.headers['Content-Type'] = 'application/json'
            return response

    return app
Exemple #2
0
def test_run():
    logger = setup_custom_logger(__name__)
    os.environ['_HANDLER'] = 'test_lambda.example_lambda'
    agent = Agent()
    agent.instrument(None)
    memory_exporter = configure_inmemory_span_exporter(agent)

    logger.info('Running test calls.')
    lamb = boto.awslambda.connect_to_region("us-east-2")

    # multiple calls
    try:
        lamb.list_functions()
    except:
        pass

    spans = memory_exporter.get_finished_spans()
    assert spans
    assert len(spans) == 1
    span = spans[0]

    assert span.attributes['endpoint'] == 'lambda'
    assert span.attributes['http.method'] == 'GET'
    assert span.attributes['aws.region'] == 'us-east-2'
    assert span.attributes['aws.operation'] == 'list_functions'
    memory_exporter.clear()
Exemple #3
0
def agent():
    # we never want to export spans to default exporter
    os.environ['HT_ENABLE_CONSOLE_SPAN_EXPORTER'] = 'true'

    # new patches will just replace old ones which allows us to call `agent.instrument()` during each test
    _uninstrument_all()
    Agent._instance = None
    agent = Agent()

    return agent
def test_run():
    logger = setup_custom_logger(__name__)
    agent = Agent()
    agent.instrument(None)

    # Setup In-Memory Span Exporter
    logger.info('Agent initialized.')
    logger.info('Adding in-memory span exporter.')
    memoryExporter = InMemorySpanExporter()
    simpleExportSpanProcessor = SimpleSpanProcessor(memoryExporter)
    agent.register_processor(simpleExportSpanProcessor)
    logger.info('Added in-memory span exporter')

    logger.info('Running test calls.')
    try:
        session = botocore.session.get_session()
        session.set_credentials(access_key="access-key",
                                secret_key="secret-key")
        region = "us-west-2"
        client = session.create_client("lambda", region_name=region)
        iam_client = session.create_client("iam", region_name=region)
        arn = _create_role_and_get_arn(iam_client)
        result = _create_lambda_function('some_function',
                                         return_headers_lambda_str(), client,
                                         arn)
        memoryExporter.clear()
        response = client.invoke(
            Payload=json.dumps({}),
            FunctionName=result['FunctionArn'],
            InvocationType="RequestResponse",
        )

        spans = memoryExporter.get_finished_spans()
        invoke_span = spans[-1]

        assert invoke_span.attributes['faas.invoked_name'] == 'some_function'
        assert invoke_span.attributes['http.status_code'] == 200
        assert invoke_span.attributes['rpc.service'] == 'Lambda'
        memoryExporter.clear()

        return 0
    except:
        logger.error(
            'Failed to test boto instrumentation wrapper: exception=%s, stacktrace=%s',
            sys.exc_info()[0], traceback.format_exc())
        raise sys.exc_info()[0]
Exemple #5
0
import aiohttp
import asyncio
from hypertrace.agent import Agent
import os
import json
import logging

agent = Agent()
agent.instrument()

logging.basicConfig()
logging.getLogger().setLevel(logging.DEBUG)


async def main():
    async with aiohttp.ClientSession() as session:
        isStream = False
        if 'STREAM' in os.environ and os.environ['STREAM'] == 'true':
            isStream = True

        query = ""
        if isStream:
            logging.debug('Receving response stream')
            query = "?stream=true"

        async with session.post(
                'http://localhost:9000/' + query,
                data='{"name":"Dave"}',
                headers={'content-type': 'application/json'}
        ) as resp:
            if isStream:
Exemple #6
0
        assert sql1SpanAsObject['attributes'][
            'db.statement'] == "INSERT INTO hypertrace_data (col1, col2) VALUES (123, 'abcdefghijklmnopqrstuvwxyz')"
        memoryExporter.clear()
        return response
    except:
        logger.error(
            'An error occurred validating span data: exception=%s, stacktrace=%s',
            sys.exc_info()[0], traceback.format_exc())
        raise sys.exc_info()[0]


agent = None
if ENABLE_INSTRUMENTATION == True:
    #
    # Code snippet here represents the current initialization logic
    #
    logger.info('Initializing agent.')
    agent = Agent()
    agent.instrument(server)
    #
    # End initialization logic for Python Agent
    #

    # Setup In-Memory Span Exporter
    logger.info('Agent initialized.')
    logger.info('Adding in-memory span exporter.')
    memoryExporter = InMemorySpanExporter()
    simpleExportSpanProcessor = SimpleSpanProcessor(memoryExporter)
    agent.register_processor(simpleExportSpanProcessor)
    logger.info('Added in-memoy span exporter')
Exemple #7
0
def post_fork(server, worker):
    """Used to reinitialize exporter & processors in separate worker processes"""
    from hypertrace.agent import Agent  # pylint:disable=C0411,C0415
    server.log.info("Add post hook %s", worker.pid)
    Agent()._init.post_fork()  # pylint:disable=W0212
Exemple #8
0
import os
from importlib import import_module

from hypertrace.agent import Agent


def modify_module_name(module_name):
    """Returns a valid modified module to get imported"""
    return ".".join(module_name.split("/"))


class HandlerError(Exception):
    pass


a = Agent()
a.instrument(None, auto_instrument=True)

path = os.environ.get("ORIG_HANDLER")

if path is None:
    raise HandlerError("ORIG_HANDLER is not defined.")

try:
    (mod_name, handler_name) = path.rsplit(".", 1)
except ValueError as e:
    raise HandlerError("Bad path '{}' for ORIG_HANDLER: {}".format(path, str(e)))

modified_mod_name = modify_module_name(mod_name)
handler_module = import_module(modified_mod_name)
Exemple #9
0
"""
WSGI config for testapp project.

It exposes the WSGI callable as a module-level variable named ``application``.

For more information on this file, see
https://docs.djangoproject.com/en/3.2/howto/deployment/wsgi/
"""

import os

from django.core.wsgi import get_wsgi_application

from hypertrace.agent import Agent

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'tests.hypertrace.agent.instrumentation.django.testapp.settings')
TEST_AGENT_INSTANCE = Agent()
TEST_AGENT_INSTANCE.instrument()
application = get_wsgi_application()
'''Enable instrumentationon all supported modules.'''  # pylint: disable=R0401
import logging
from hypertrace.agent import Agent
from hypertrace.env_var_settings import get_env_value

# Initialize logger
logger = logging.getLogger(__name__)  # pylint: disable=C0103

skip_modules = get_env_value('SKIP_MODULES')
if skip_modules:
    logger.debug("[env] Loaded SKIP_MODULES from env")
    if len(skip_modules) > 0:
        skip_modules = skip_modules.replace(' ', '')
        skip_modules = skip_modules.split(',')
else:
    skip_modules = []

# Create Hypertrace agent
agent = Agent()
agent.instrument(None, skip_modules, auto_instrument=True)