Giter Site home page Giter Site logo

getsentry / raven-python Goto Github PK

View Code? Open in Web Editor NEW
1.7K 184.0 663.0 5.95 MB

Raven is the legacy Python client for Sentry (getsentry.com) — replaced by sentry-python

Home Page: https://sentry.io

License: BSD 3-Clause "New" or "Revised" License

Makefile 0.20% Shell 0.49% Python 99.28% HTML 0.02%
crash-reporting crash-reports python monitoring sentry sentry-client tag-archived

raven-python's Introduction


Deprecated for sentry-sdk package

Raven is deprecated in favor of Sentry-Python.

Feature development and most bugfixes happen exclusively there, as Raven is in maintenance mode.


Raven - Sentry for Python

PyPi page link -- version

image

PyPi page link -- MIT licence

PyPi page link -- Python versions

Code Climate

Raven is the official legacy Python client for Sentry, officially supports Python 2.6–2.7 & 3.3–3.7, and runs on PyPy and Google App Engine.

It tracks errors and exceptions that happen during the execution of your application and provides instant notification with detailed information needed to prioritize, identify, reproduce and fix each issue.

It provides full out-of-the-box support for many of the popular python frameworks, including Django, and Flask. Raven also includes drop-in support for any WSGI-compatible web application.

Your application doesn't live on the web? No problem! Raven is easy to use in any Python application.

For more information, see our Python Documentation for framework integrations and other goodies.

Features

  • Automatically report (un)handled exceptions and errors
  • Send customized diagnostic data
  • Process and sanitize data before sending it over the network

Quickstart

It's really easy to get started with Raven. After you complete setting up a project in Sentry, you’ll be given a value which we call a DSN, or Data Source Name. You will need it to configure the client.

Install the latest package with pip and configure the client:

pip install raven --upgrade

Create a client and capture an example exception:

python

from raven import Client

client = Client('___DSN___')

try:

1 / 0

except ZeroDivisionError:

client.captureException()

Raven Python is more than that however. Checkout our Python Documentation.

Contributing

Raven will continue to be maintained for bugfixes and contributions are more than welcome! New features should only go into the new sentry-python SDK.

There are many ways to contribute:

Resources

Not using Python? Check out our SDKs for other platforms.

raven-python's People

Contributors

acdha avatar alex avatar arnavk avatar ashwoods avatar asvetlov avatar blueyed avatar buriy avatar chebee7i avatar ckj avatar crankycoder avatar dcramer avatar do3cc avatar dokterbob avatar dz avatar ehfeng avatar flupke avatar jimfulton avatar jokull avatar joshk avatar justquick avatar kjagiello avatar luisulloa avatar mattrobenolt avatar mfrasca avatar mitsuhiko avatar msabramo avatar noirbizarre avatar untitaker avatar vitaliyf avatar xordoquy avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

raven-python's Issues

Celery issues

I am having issues with celery - sentry integration.
Everything was working some time ago but after some update (not sure what exactly changed - sentry or celery) things started to go down. Right now, every time exception occurs I get:

Exception with traceback in logfile which is not logged in with sentry +

WARNING 2012-01-23 00:39:21,499 celery: Top level Sentry exception caught - failed creating log record
WARNING 2012-01-23 00:39:21,499 celery: Task %(name)s[%(id)s] raised exception: %(exc)s
%(traceback)s
WARNING 2012-01-23 00:39:21,501 celery: Traceback (most recent call last):
  File "/opt/local/srv/python-environments/hydra/lib/python2.7/site-packages/sentry/client/handlers.py", line 31, in emit
    get_client().create_from_record(record, request=request)
  File "/opt/local/srv/python-environments/hydra/lib/python2.7/site-packages/sentry/client/base.py", line 308, in create_from_record
    return self.create_from_exception(record.exc_info, **kwargs)
  File "/opt/local/srv/python-environments/hydra/lib/python2.7/site-packages/sentry/client/base.py", line 358, in create_from_exception
    frames = varmap(shorten, get_stack_info(iter_traceback_frames(exc_traceback)))
  File "/opt/local/srv/python-environments/hydra/lib/python2.7/site-packages/sentry/utils/stacks.py", line 118, in get_stack_info
    for frame in frames:
  File "/opt/local/srv/python-environments/hydra/lib/python2.7/site-packages/sentry/utils/stacks.py", line 108, in iter_traceback_frames
    if not tb.tb_frame.f_locals.get('__traceback_hide__'):
AttributeError: '_Frame' object has no attribute 'f_locals'

which gets logged instead (well, not really helpful to say the least). Using sentry with logging config (disable existing), handler:

    'sentry': {
        'level': 'WARNING',
        'class': 'sentry.client.handlers.SentryHandler',
        'formatter': 'verbose'
    },

Pylons middleware

Hi,

I've used the following Middleware for pylons, perhaps this could be included or noted in the docs.


import webob
from raven.middleware import Sentry, get_current_url
from raven.base import Client


class SentryMiddleware(Sentry):
    """Sentry middleware for pylons

    Add the following settings in your config:

    sentry.server = <your server url>
    sentry.site = <site name>
    sentry.project = <project id> (optional)
    sentry.public_key = <public key>
    sentry.secret_key = <secret key>

    """

    def __init__(self, app, config):
        client = Client(
            servers=[config['sentry.server']],
            public_key=config['sentry.public_key'],
            secret_key=config['sentry.secret_key'],
            site=config['sentry.site'],
            project=config.get('sentry.project', 1),
            include_paths=['grenslandauto']
        )
        super(SentryMiddleware, self).__init__(app, client)

    def handle_exception(self, exc_info, environ):
        request = webob.Request(environ)
        event_id = self.client.create_from_exception(
            exc_info=exc_info,
            url=get_current_url(environ, strip_querystring=True),
            data={
                'culprit': '%s: %s' % (
                    exc_info[1].__class__.__name__, exc_info[1].message),
                'sentry.interfaces.Http': {
                    'method': request.method,
                    'url': request.url,
                    'query_string': request.query_string,
                    'data': request.POST.mixed(),
                    'cookies': request.cookies.multi,
                    'headers': dict(request.headers),
                    'env': request.environ,
                }
            },
        )
        return event_id

This is for raven 1.0.4

Let me know if you want something like that in raven.contrib.pylons or something, then I'll create a pull request.

Thanks!

SENTRY_SITE and SENTRY_PROJECT not respected by Django handler?

I was reading through the code, trying to figure out how to specify the site and/or the project.

Based on https://github.com/dcramer/raven/blob/master/raven/conf/defaults.py and https://github.com/dcramer/raven/blob/master/raven/contrib/django/models.py I believe these should be handled by SENTRY_SITE and SENTRY_PROJECT. But I've set these and deployed them, and error messages are still ending up in my Default project w/o any site information.

If I'm ever to use raven on more than one site, I'll need to be able to specify these. :)

Error when varmap contains unicode keys

Let's assume the following call:

def foo(**kwargs):
    raise ValueError

foo(**{u'éééé': 'éééé'})

This will trigger an exception, but raven will try to print the dict using raven/utils/encoding.py:85

ret = dict((str(k), transform_rec(v)) for k, v in value.iteritems())

This assumes the keys in a dict are str, but in this case it's an unicode string and thus will fail to decode as ascii.

Raven shouldn't assume keys in a dict are str but should encode/use the repr of the key when it's unicode

UnicodeEncodeError on print >> sys.stderr when redirecting to file

Hi,

I am getting UnicodeEncodeError's in raven.handlers.logging.py (lines 54, 61-63) on print to stderr, but only when redirecting stdout and stderr. It seems to work when printing to a macosx terminal, but not to a linux file.
It happens only in exception fallback cases, but I've had a fair few of those because issue #68 (md5.checksum with unicode).
Fixed by print >> sys.stderr, to_string(stuff).

Cheers,
Gijsbert

PS Many many thanks for sentry/raven, it's awesome.

NoneType object has no attribute update

I'm getting the following error when Raven is trying to log what i guess is a 404 error for the favicon not being found:

Top level Sentry exception caught - failed creating log record
Not Found: /favicon.ico
Traceback (most recent call last):
  File "/usr/local/Cellar/python/2.7.2/lib/python2.7/site-packages/raven/contrib/django/handlers.py", line 33, in emit
    get_client().create_from_record(record, request=request)
  File "/usr/local/Cellar/python/2.7.2/lib/python2.7/site-packages/raven/contrib/django/__init__.py", line 130, in create_from_record
    return super(DjangoClient, self).create_from_record(record, **kwargs)
  File "/usr/local/Cellar/python/2.7.2/lib/python2.7/site-packages/raven/base.py", line 252, in create_from_record
    **kwargs
  File "/usr/local/Cellar/python/2.7.2/lib/python2.7/site-packages/raven/contrib/django/__init__.py", line 38, in process
    kwargs['data'].update(dict(
AttributeError: 'NoneType' object has no attribute 'update'

Sentry using HTTPS

I've been having trouble getting raven to communicate with a Sentry server using https. Is this an issue with my raven configuration or is https not supported?

Raven never gives up, never gives in, never surrenders?

I've been testing raven and sentry out. I have raven set up on a Django site as described in the docs. I accidentally misconfigured SENTRY_SERVERS, putting an incorrect server URL in. I deployed this, and tested a page that was throwing an error. Ever since, Raven has been trying to contact the Sentry server on that incorrect URL--I know this because it's still writing to my error log. I've stopped the Django server, restarted it with correct settings, no effect. Raven keeps going.

I eventually tried reconfiguring the local hosts file and Nginx to redirect the incorrect URL to the correct one. This worked, but Sentry is sending poor Raven a 405 error now, and Raven is retaliating by hitting the URL as frequently as possible. Raven keeps going!

I've pored over the output of ps, I've lsof'd the error log to see what still has it open (nothing), but I can't figure out what process is still going on.

I really do appreciate that Raven is faithfully trying to send that error message, but dang! He's worse than the Energizer bunny!

Here's a sample of the error log output I'm seeing:

Unable to reach Sentry log server: HTTP Error 405: METHOD NOT ALLOWED (url: http://mysentryserver.example.com/sentry/api/store/, body: )
Traceback (most recent call last):
  File "/opt/django/federation/lib/python2.6/site-packages/raven/base.py", line 291, in send
    self.send_remote(url=url, data=message, headers=headers)
  File "/opt/django/federation/lib/python2.6/site-packages/raven/base.py", line 244, in send_remote
    return self.send_http(url, data, headers)
  File "/opt/django/federation/lib/python2.6/site-packages/raven/base.py", line 269, in send_http
    response = urllib2.urlopen(req, data).read()
  File "/usr/lib/python2.6/urllib2.py", line 126, in urlopen
    return _opener.open(url, data, timeout)
  File "/usr/lib/python2.6/urllib2.py", line 397, in open
    response = meth(req, response)
  File "/usr/lib/python2.6/urllib2.py", line 510, in http_response
    'http', request, response, code, msg, hdrs)
  File "/usr/lib/python2.6/urllib2.py", line 429, in error
    result = self._call_chain(*args)
  File "/usr/lib/python2.6/urllib2.py", line 369, in _call_chain
    result = func(*args)
  File "/usr/lib/python2.6/urllib2.py", line 605, in http_error_302
    return self.parent.open(new, timeout=req.timeout)
  File "/usr/lib/python2.6/urllib2.py", line 397, in open
    response = meth(req, response)
  File "/usr/lib/python2.6/urllib2.py", line 510, in http_response
    'http', request, response, code, msg, hdrs)
  File "/usr/lib/python2.6/urllib2.py", line 435, in error
    return self._call_chain(*args)
  File "/usr/lib/python2.6/urllib2.py", line 369, in _call_chain
    result = func(*args)
  File "/usr/lib/python2.6/urllib2.py", line 518, in http_error_default
    raise HTTPError(req.get_full_url(), code, msg, hdrs, fp)
HTTPError: HTTP Error 405: METHOD NOT ALLOWED
Top level Sentry exception caught - failed creating log record
Unable to reach Sentry log server: HTTP Error 405: METHOD NOT ALLOWED (url: http://mysentryserver.example.com/sentry/api/store/, body: )
Traceback (most recent call last):
  File "/opt/django/federation/lib/python2.6/site-packages/raven/handlers/logging.py", line 51, in emit
    return self._emit(record)
  File "/opt/django/federation/lib/python2.6/site-packages/raven/contrib/django/handlers.py", line 34, in _emit
    return super(SentryHandler, self)._emit(record, request=request)
  File "/opt/django/federation/lib/python2.6/site-packages/raven/handlers/logging.py", line 87, in _emit
    date=date, **kwargs)
  File "/opt/django/federation/lib/python2.6/site-packages/raven/contrib/django/__init__.py", line 92, in capture
    result = super(DjangoClient, self).capture(event_type, **kwargs)
  File "/opt/django/federation/lib/python2.6/site-packages/raven/base.py", line 236, in capture
    self.send(**data)
  File "/opt/django/federation/lib/python2.6/site-packages/raven/contrib/django/__init__.py", line 112, in send
    return super(DjangoClient, self).send(**kwargs)
  File "/opt/django/federation/lib/python2.6/site-packages/raven/base.py", line 291, in send
    self.send_remote(url=url, data=message, headers=headers)
  File "/opt/django/federation/lib/python2.6/site-packages/raven/base.py", line 244, in send_remote
    return self.send_http(url, data, headers)
  File "/opt/django/federation/lib/python2.6/site-packages/raven/base.py", line 269, in send_http
    response = urllib2.urlopen(req, data).read()
  File "/usr/lib/python2.6/urllib2.py", line 126, in urlopen
    return _opener.open(url, data, timeout)
  File "/usr/lib/python2.6/urllib2.py", line 397, in open
    response = meth(req, response)
  File "/usr/lib/python2.6/urllib2.py", line 510, in http_response
    'http', request, response, code, msg, hdrs)
  File "/usr/lib/python2.6/urllib2.py", line 429, in error
    result = self._call_chain(*args)
  File "/usr/lib/python2.6/urllib2.py", line 369, in _call_chain
    result = func(*args)
  File "/usr/lib/python2.6/urllib2.py", line 605, in http_error_302
    return self.parent.open(new, timeout=req.timeout)
  File "/usr/lib/python2.6/urllib2.py", line 391, in open
    response = self._open(req, data)
  File "/usr/lib/python2.6/urllib2.py", line 409, in _open
    '_open', req)
  File "/usr/lib/python2.6/urllib2.py", line 369, in _call_chain
    result = func(*args)
  File "/usr/lib/python2.6/urllib2.py", line 1161, in http_open
    return self.do_open(httplib.HTTPConnection, req)
  File "/usr/lib/python2.6/urllib2.py", line 1133, in do_open
    h.request(req.get_method(), req.get_selector(), req.data, headers)
  File "/usr/lib/python2.6/httplib.py", line 910, in request
    self._send_request(method, url, body, headers)
  File "/usr/lib/python2.6/httplib.py", line 947, in _send_request
    self.endheaders()
  File "/usr/lib/python2.6/httplib.py", line 904, in endheaders
    self._send_output()
  File "/usr/lib/python2.6/httplib.py", line 776, in _send_output
    self.send(msg)
  File "/usr/lib/python2.6/httplib.py", line 735, in send
    self.connect()
  File "/usr/lib/python2.6/httplib.py", line 716, in connect
    self.timeout)
  File "/usr/lib/python2.6/socket.py", line 504, in create_connection
    sock = socket(af, socktype, proto)
  File "/usr/lib/python2.6/socket.py", line 182, in __init__
    _sock = _realsocket(family, type, proto)
RuntimeError: maximum recursion depth exceeded while calling a Python object

This repeats every few seconds, ad infinitum.

Flask client data collection needs to be configurable

It's currently hard to collect any extra data when a flask exception occurs because the data collection occurs in a closure inside the class.

Only the request data is collected at the moment. It would be nice to be able to plug extra data in the payload, to add support for user info for example and template info, like it's done in the django client

SENTRY_MAX_LENGTH_STRING being ignored?

I've got the following set on a Django project's settings.py:

SENTRY_MAX_LENGTH_STRING = 500

But it looks like the default 100 character limit is still being imposed.

'AccountTransactions.InqStudentDetail: , System.InvalidOperationException: Nullable object must have '

IntegrityError on message_id/event_id when using log handler

I've been trying to use raven in conjunction with sentry to log any errors that celery would produce. In doing so, I've ran into an IntergrityError issue where I can only ever post 1 error to Sentry before having to restart celery. It would appear in the raven Client base class, that event_id which I believe should be a uuid hex generated on capture, is instead the same value every time. Here's an excerpt from my celery log:

[2012-02-29 14:04:12,969: INFO/MainProcess] Got task from broker: shared.tasks.authorization.create_cadr_auth[08cf77bb-f7ea-4752-a683-59447c9e0266]
[2012-02-29 14:04:13,093: WARNING/PoolWorker-1] CURRENT EVENT ID: 8dfb3bc8722e4483bad09382b5f87ee4
[2012-02-29 14:04:13,201: INFO/MainProcess] Task shared.tasks.authorization.create_cadr_auth[08cf77bb-f7ea-4752-a683-59447c9e0266] succeeded in 0.202355861664s: False
[2012-02-29 14:04:15,295: INFO/MainProcess] Got task from broker: shared.tasks.authorization.create_cadr_auth[a8844b1b-b04e-4d84-a437-c7cc72983970]
[2012-02-29 14:04:15,415: WARNING/PoolWorker-3] CURRENT EVENT ID: 8dfb3bc8722e4483bad09382b5f87ee4

If I restart celery, I'll get a new event id, but not until then. I believe this is what's causing the IntegrityError that we're seeing over and over.

We're running 1.3.1, with Celery 2.4.6. We're using the logging dictionary setup that Django 1.3 introduced, and we're using it in a fairly normal/sane manner. The only difference being is that we check to make sure raven is installed, and append handlers as necessary like so:

    conf['handlers']['sentry'] = {
        'level': 'DEBUG',
        'class': 'raven.contrib.django.handlers.SentryHandler',
        'formatter': 'verbose'
    }

    # ERROR level handler used by celery for sentry
    conf['handlers']['sentry_celery'] = {
        'level': 'ERROR',
        'class': 'raven.contrib.django.handlers.SentryHandler',
        'formatter': 'verbose'
    }

    conf['loggers']['celery.task.default']['handlers'] += ['sentry_celery']

We're using Raven 1.4.3, with sentry 2.7.0. Any ideas? We're seeing this in other areas with our log usage as well, it's just much, much easier to track/see/catch with celery.

raven.contrib.django.capture exceptions

I keep seeing a lot of stuff like this under the raven.contrib.django.capture.exceptions logger in Sentry:

Internal Server Error: /admin/enrollment/enrollmentinvitation/1463/

Traceback (most recent call last):

  File "raven/utils/stacks.py", line 170, in get_stack_info
    lineno = frame.f_lineno - 1

  File "raven/base.py", line 187, in capture
    'frames': varmap(lambda k, v: shorten(v), get_stack_info(frames))

  File "raven/contrib/django/__init__.py", line 92, in capture
    result = super(DjangoClient, self).capture(event_type, **kwargs)

  File "raven/handlers/logging.py", line 103, in _emit
    date=date, **kwargs)

  File "raven/contrib/django/handlers.py", line 32, in _emit
    return super(SentryHandler, self)._emit(record, request=request)

  File "raven/handlers/logging.py", line 48, in emit
    return self._emit(record)

  File "logging/__init__.py", line 679, in handle
    self.emit(record)

  File "logging/__init__.py", line 1220, in callHandlers
    hdlr.handle(record)

  File "logging/__init__.py", line 1183, in handle
    self.callHandlers(record)

  File "logging/__init__.py", line 1173, in _log
    self.handle(record)

  File "logging/__init__.py", line 1082, in error
    self._log(ERROR, msg, args, **kwargs)

  File "django/core/handlers/base.py", line 209, in handle_uncaught_exception
    'request':request

  File "django/core/handlers/base.py", line 169, in get_response
    response = self.handle_uncaught_exception(request, resolver, sys.exc_info())

  File "django/core/handlers/wsgi.py", line 272, in __call__
    response = self.get_response(request)

  File "deployment/misc_config/cbwsgi.py", line 19, in application
    return _application(environ, start_response)

  File "gunicorn/workers/async.py", line 62, in handle_request
    respiter = self.wsgi(environ, resp.start_response)

  File "gunicorn/workers/async.py", line 37, in handle
    self.handle_request(req, client, addr)

  File "eventlet/greenthread.py", line 192, in main
    result = function(*args, **kwargs)

Not much to go from there. I'm running Django 1.3.1, Python 2.7, gunicorn with the eventlet worker (which does monkeypatch some socket-related stuff).

celery SoftTimeLimitExceeded causes cascade from raven

While trying to report a legit exception, celery threw SoftTimeLimitExceeded - there's generally a window of time between SoftTimeLimitExceeded being raised and the task being terminated.

I think it would be good to catch SoftTimeLimitExceeded, finishing logging the real exc, and then re-raising the SoftTimeLimitExceeded.

It'd be a little hairy because any place in capture could receive the exception, but I think it wouldn't be too bad. I'd be happy to write the code if you agree..

We'd need to conditionally import celery and disable the retry if not available.

Thoughts?

Example stack:

SoftTimeLimitExceeded

Stacktrace (most recent call last):

File "raven/handlers/logging.py", line 66, in emit
self.client.capture('Exception')

File "raven/contrib/django/handlers.py", line 32, in _emit
return super(SentryHandler, self)._emit(record, request=request)

File "raven/handlers/logging.py", line 112, in _emit
data.update(handler.capture(exc_info=record.exc_info))

File "raven/events.py", line 87, in capture
self.logger.exception(e)

File "raven/utils/init.py", line 33, in varmap
ret = [varmap(func, f, context, name) for f in var]

File "raven/utils/init.py", line 31, in varmap
ret = dict((k, varmap(func, v, context, k)) for k, v in var.iteritems())

File "raven/utils/init.py", line 31, in
ret = dict((k, varmap(func, v, context, k)) for k, v in var.iteritems())

File "raven/utils/init.py", line 33, in varmap
ret = [varmap(func, f, context, name) for f in var]

File "raven/utils/init.py", line 32, in varmap
elif isinstance(var, (list, tuple)):

File "celery/concurrency/processes/pool.py", line 130, in soft_timeout_sighandler
raise SoftTimeLimitExceeded()

Send django logs via django-ztaskq

django-ztaskq is a celery like framework, but it makes use of zeromq for sending messages. It will be good for sentry/raven to have support for this for performance reasons.

In some tests it was noticed that average time take to schedule a task was

  • In celery: 4.507 ms
  • In ztaskq: 0.0132 ms (almost 350 times faster).

In scenarios where there is heavy load, it may help in performance.

The downside is that, there is a possibility of message loss (since the architecture is almost broker-less).

(Have a patch for this. Will send it after #31 is pulled)

raven.contrib.django.SentryClient chokes on dict params

Python's logger accepts a dict as the first argument to logging functions and then interpolates them into the message. raven is not expecting params to be a dict and so chokes on it when converting trying to convert to a tuple before interpolating.
this tuple cooersion should probably be removed....

109:            return msg['message'] % tuple(msg['params'])

Django's SENTRY_DSN causes exception

As of 32bbbf9

File ".../eggs/raven-1.3.3-py2.7.egg/raven/base.py", line 88, in __init__
    raise ValueError("You seem to be incorrectly instantiating the raven Client class.")
ValueError: You seem to be incorrectly instantiating the raven Client class.

when trying to set SENTRY_DSN to dsn value.

The exception is raised in Client initialization and caused by these lines

if isinstance(servers, basestring):
    # must be a DSN:
    if dsn:
        raise ValueError("You seem to be incorrectly instantiating the raven Client class.")
    dsn = servers
    servers = None

Make raven logging.SentryHandler capture the stack

It would be possible to induce an exc_info for the purposes of rich reporting to sentry, just as it does on real exceptions.

We could have a conf flag which tells raven to do that.

It would really help debugging log messages (with associated overhead, of course).

add site to outgoing message

first of all, huge fan.

so, the client takes a "site" parameter in its constructor but it doesn't do anything with it in raven.base.Client.capture.

can you add a

    if self.site:
      data["site"] = self.site

we use sites to filter out which service is spewing errors, and that would be really helpful for us.

Add floats to the encoding.py

This is an easy one: in raven/utils/encoding.py:transform, you look for a bunch of data types but you forgot about float. That's blowing up Tornado's internal logging right now.

at line 107, just add:

elif isinstance(value, float):
ret = float(value)

SentryHandler mixing new and old style classes

Hi,

the SentryHandler for logging has some issues.
While it inherits from an old style class (logging.Handler) it uses super which is reserved to new class style.
I had to comment in SentryHandler.init

super(SentryHandler, self).__init__()

and replace it by:

logging.Handler.__init__(self)

Customizing message via logging.error

I'm currently using the following pattern in my code with raven

import logging 
try:
  do_something()
except:
  logger = logging.getLogger(MY_LOGGER)
  logger.error("do_something failed badly", exc_info=True)

This works great in that it shows a stack trace and everything. The problem is that sentry (2.0.0RC7) shows the message as something like 'main.do_something'. I can go in to the details of the message to see what my actual error message was, but it would be really nice to control the eventual 'culprit' value that raven passes on to sentry. Stepping through the RavenHandler code it looks like when exc_info=True culprit is entirely controlled by raven.utils.stacks.get_culprit.

It would be easiest if I could do something like

logger.error('do_something failed badly', exc_info=True, extra={'culprit':'Do_something Failure'})

And have sentry show the message as 'Do_something Failure' rather than main.do_something

I'd be willing to submit a pull request, I just want to know if I do if it would be considered - I'm deploying this stuff to many, many servers via pip and I'd rather not fork this project just for this feature

Extra data removed for exceptions by django handler

It seemed to me that I would be able to pass extra information with logging.log(..., extra={'data': my_data}), and this seems to be the case with the base Client. However, the DjangoClient removes data from the kwargs in create_from_exception and does not pass it on to the base call. I'm sorry if this was intentional, but it seems like a bug to me.

ValueError: Unable to configure handler 'sentry':

ValueError: Unable to configure handler 'sentry': Cannot resolve 'raven.contrib.django.logging.SentryHandler': No module named SentryHandler

trying to migrate from sentry.client to raven, i get this error message. set it up exactly per the docs on read the docs.

Raven's stack iteration trashes exception frames

Currently the get_stack_info function assumes that frame.f_lineno is reliable. This however is not the case when the error cause and the error handler both life in the same frame. Unfortunately this is not changeable without changing the get_stack_info function.

Testcase:

from raven.handlers.logging import SentryHandler
dsn = 'http://<stuff>:<here>@localhost:9000/1'
handler = SentryHandler(dsn)
from logging import getLogger
logger = getLogger()
logger.addHandler(handler)
try:
    1/0
except:
    logger.error('moep', exc_info=True)

The problem is that frame.f_lineno will be the line with the logger.error call but traceback.tb_lineno will point to the proper location of the traceback which is the 1/0 line. The workaround is to never log in the same frame as the one that caused the exception though that might not be a 100% fix.

Other non-web uses [DOCS]

On the front page it states:

Don't use a framework? No problem! Raven is easy to use in any Python application, even if it's not on the web.

Would appreciate some clarification or pointers on how to use raven from a non-web app.

Improper configuration results in messages "failing over" to the Default project, without error or warning

I'm splitting this issue off of #44.

In my Django settings, I'm specifying SENTRY_PROJECT = 2. I've also set up a corresponding project on my sentry server. However, all messages/errors/exceptions from the site are going to the Default project 1.

Other settings that might be pertinent:

SENTRY_PROJECT = 2
SENTRY_SITE = 'my.crossway.org'
SENTRY_PROCESSORS = (
    'raven.processors.SantizePasswordsProcessor',
    )
SENTRY_DSN = 'http://<pubkey>:<secret>@<host>/2'  # Just added this, but I don't know what it's for.

INSTALLED_APPS += (
    'raven.contrib.django',
    )

MIDDLEWARE_CLASSES = (
    # We recommend putting this as high in the chain as possible
    'raven.contrib.django.middleware.SentryResponseErrorIdMiddleware',
    'raven.contrib.django.middleware.Sentry404CatchMiddleware',
    ...
    )


LOGGING['root'] = {
    'level': 'INFO',
    'handlers': ['sentry', 'console'],
    }


LOGGING.setdefault('handlers', {}).update({
   'sentry': {
        'level': 'ERROR',
        'class': 'raven.contrib.django.handlers.SentryHandler',
        },

    })

I've tried this with both the latest Sentry release on PyPI and the master branch, as well as both release and master of Raven. I'm stumped.

No module named events when using py2exe

I got No module named events when trying to run an app with py2exe. It may not be a bug but I didn't found much on the web about using raven with py2exe.

Traceback (most recent call last):
  File "test-raven-py2exe.py", line 10, in <module>
  File "raven\base.pyc", line 464, in captureException
  File "raven\base.pyc", line 240, in capture
  File "raven\base.pyc", line 177, in get_handler
  File "raven\base.pyc", line 35, in __missing__
ImportError: No module named events

Code

from raven import Client

clientRaven = Client(dsn=my_dns_url)

try:
    1 / 0
except:
    ident = clientRaven.get_ident(clientRaven.captureException())
    print "Exception caught; reference is {0}".format(ident)

My setup.py

from distutils.core import setup
import py2exe

setup(windows=['test-raven-py2exe.py'])

I got this when running python setup.py py2exe

The following modules appear to be missing
['Carbon', 'Carbon.Files', '_scproxy', 'conf.load', 'email.Generator', 'email.Iterators']

Local time is used instead of UTC timestamps

Sentry documentation at https://github.com/dcramer/django-sentry/blob/master/docs/technical/index.rst clearly says:
"POST Body ... timestamp: indicates when the logging record was created (in the Sentry client). The Sentry server assumes the time is in UTC."

However, Raven disregards that and sends local time: https://github.com/dcramer/raven/blob/master/raven/base.py#L188

This is a real headache. At my servers, the local time is UTC everywhere, and Django TIME_ZONE is set to -5 ('America/New_York'). This makes all Django crashes appear to happen "5 hours ago" in Sentry. Fixing datetime.datetime.now() to datetime.datetime.utcnow() in the line above resolves the problem.

AttributeError in 'raven.utils.wsgi.get_headers'

Unless I've done something odd, it appears that 'get_headers' can't cope with a key that is not a string (more specifically, something that doesn't support '.startswith'). It appears django-reversion puts a strange beast in ENVIRON.

AttributeError: 'tuple' object has no attribute 'startswith'

...

  File "raven/utils/wsgi.py", line 17, in get_headers
    if key.startswith('HTTP_') and key not in \

A snippet of my ENVIRON containing the trouble AFAICT:

{"('reversion.revision_middleware_active', <reversion.middleware.RevisionMiddleware object at 0x282d490>)": True,
 'CC': 'clang',
 'CELERY_LOADER': 'djcelery.loaders.DjangoLoader',
 'COLORTERM': 'gnome-terminal',
 'COMPIZ_CONFIG_PROFILE': 'ubuntu',
 'CONTENT_LENGTH': '',
 'CONTENT_TYPE': 'text/plain',

client.captureException() breaking Raven

When I call client.captureException() I receive the following trace back

ubuntu@util:/home/code/filterfoundry$ python manage.py  help 
/usr/local/lib/python2.6/dist-packages/raven/__init__.py:12: UserWarning: Module S3 was already imported from /home/code/filterfoundry/S3.pyc, but /usr/local/lib/python2.6/dist-packages is being added to sys.path
  VERSION = __import__('pkg_resources') \
INFO 2012-02-14 19:44:25,614 base 13438 140544376293120 Configuring Raven from DSN: '[redacted]'
Traceback (most recent call last):
  File "manage.py", line 4, in <module>
    import settings # Assumed to be in the same directory.
  File "/home/code/filterfoundry/settings.py", line 609, in <module>
    client.captureException()
  File "/usr/local/lib/python2.6/dist-packages/raven/base.py", line 463, in captureException
    return self.capture('Exception', exc_info=exc_info, **kwargs)
  File "/usr/local/lib/python2.6/dist-packages/raven/contrib/django/client.py", line 94, in capture
    result = super(DjangoClient, self).capture(event_type, **kwargs)
  File "/usr/local/lib/python2.6/dist-packages/raven/base.py", line 242, in capture
    result = handler.capture(**kwargs)
  File "/usr/local/lib/python2.6/dist-packages/raven/events.py", line 75, in capture
    exc_type = exc_type.__name__
AttributeError: 'NoneType' object has no attribute '__name__'
ubuntu@util:/home/code/filterfoundry$ 

TypeError in get_culprit

And the culprit is None in frame['module']

culprit = '.'.join([frame['module'], frame['function']])

should be

culprit = '%s.%s' % (frame['module'], frame['function'])

for very obvious reasons.

Inverted stack traces

When using SENTRY_AUTO_LOG_STACKS the resulting traces in Sentry are bottom-to-top whereas the traces from an exception are top-to-bottom. This is not only very confusing, but it causes Sentry to identify the WSGI handler as the cause of all errors in logging statements.

Using Raven 0.6, Sentry 1.13.1, and Django 1.3.

SanitizeProcessor doesn't sanitize POST bodies

Looks like the SanitizeProcessor isn't sanitizing the values seen under the Request section beside "Body:". There was a recent commit that was aimed at fixing this by adding 'body' to the filter_http method, but this doesn't appear to work.

This could be a pretty severe vulnerability for anyone using Raven/Sentry for commerce sites, as customer credit card data could be stored.

raven.contrib.celery.CeleryClient

I use sentry client raven.contrib.celery.CeleryClient

But i get error message:

Task raven.contrib.celery.send_raw with id f046e41d-07a5-49a1-8c31-1eb9ae631ef5 raised exception:
"TypeError('send_raw() takes exactly 2 arguments (1 given)',)"

Task was called with args:     ('eJyVVttu2zgQ/RVCwKIJkOjuK9I8LNBFg16BBH3YujBoamQzoSWBpOIYRf59h0PZUWKn7TqJPCLnzjOH+RlYuYa5aaCywZRVrVJnLDD4prehrCzokgsw4bsHAY2VdYVKPwO7bQCF4OrLO61rHaDJPVctrck1XwLbcMNkJep1o8CCU1jXRatIA3a+TPBIwfQ96HnF17RrLBd352aThKBAhLp1xqJVjZaWrN2qqDFBuQjXXN+BDS03dyasyxK0CdtG1byYN62wrabQCu5BoW0e4wvKlZ3LwvkaT2IYDXghFnmax0k8zpJJmmQ5xCOejSCh0CsQd6ZdO/14HKciF/EkGWeLcsRhMBqXMYd4MBhkWZE7fXiwmrsuPe6LNtS0dWOpgDgchKnTXGreNKCUdKtpmIUDt1rcCixRb/1i7lWLW14ta7eUoB7lVW2L1nh/WRi7lWZrpeqW0J1bsny5lF3UiV9a8S212PuP8YerZsWpVAo872s450lYyoorH8TUrV35nZF3qDl21KfmsqUjlRae0NTo+haEyyI9iq1PYAxixjdpL+/AhTBiz490yv4yVC/XfO3q/X4cdD9cKg7eWM26oXrjJD2P8Xd8k+TTPJ9m4zBLhsNJ8i9B9I+Cvwbww8KuXRcRDcLXVmK6hIXvKLeV6MYpOAQsX5h5w32fo7qxUddCEzn0R3jQq7rycjcJkZ+EiCYh6iah2VKbNMydFgKTesW6DyY7dfus95HVFVX3lmFzcTBDoWoDJ6d9PT++rOvQmXufBj+IArRHeiOpknmr3dQFK2ubaRRtNpsQa7F1rQyOdeTLjuRC1eIuyuJRlA6H+SS8bZYuXFlr6pvVLdBYid65nLw5dgpvzihRtX4PvADtqsUTT85YgoOfDPAP5Xziv90SPl3i1C7n/eKLk6bs5m82iFM2a+M8Kd0zj90zG9MzpSfQMyelLKFn3FONX65nhZfJIE/6doPe/qgXqOgFoqD5gmThjfNeNt4g66WR9lwvenJnPGY9i/GTvzwOuwyfdrz8zKPopTZhB/VlB13Lhz3r0sv9MijFvGQfvl1HH769Z9lZcj45QwdpnA4vg90pdcSd5JNsnOHhDkYfOyow3RF+vfoYEoj/kQrCr7SBGEEOqAQwbln8wIvhpABx2dG1M9ujDo12N9EzODr+OE/cmLutneperaNGhOynupClBEqz4BYcAYU74eQ1PJ56ttZLsPNXc5DVtdXA6Sq64EUhqxJDKldUMk7x4kqylG1WOLGsbHCGLwxOFl6P5LFeOAZh3Zfvw6KcDFJxeUmk3dTGHiUK99GAE125JGjU+yn+IQ317v/f3OB0Ffk85kpWZNPPRdXLJVITEBG0s19fFDP0Zqw+Qf44Ja6au669vUFW8WSBASp3sybpELvwnJmJ/Q4IuTU6Ulirp+E0HEaFNPa8QbJH2JkIERg9IfDXJOw+BlQZlgDFySyYBacvOZm2EUAcT9TLIGqkN3z9XFdwQOElq2rbOZWVNCsoXvCz2/vfs/JLiPSDEjMf3CyaS4Tljr5ngeCVs6DBZXYljb9XXf0vAXasn09oelbD76BzLJNjN0l3DHtw5Hn2SP9OeOztUezRGzz+B220YK4=',) kwargs: {}.

The contents of the full traceback was:

Traceback (most recent call last):
 File "/opt/projects/virtualenv/lib/python2.6/site-packages/celery/execute/trace.py", line 47, in trace
   return cls(states.SUCCESS, retval=fun(*args, **kwargs))
 File "/opt/projects/virtualenv/lib/python2.6/site-packages/celery/app/task/__init__.py", line 247, in __call__
   return self.run(*args, **kwargs)
 File "/opt/projects/virtualenv/lib/python2.6/site-packages/celery/app/__init__.py", line 175, in run
   return fun(*args, **kwargs)
TypeError: send_raw() takes exactly 2 arguments (1 given)

Apache connection times out with New Relic active

Our web servers have Nginx reverse proxying Apache serving our Django app. We are also running New Relic's Python agent with the required changes to our WSGI module:

import os, sys

import newrelic.agent
newrelic.agent.initialize('/path/to/project/newrelic.ini')

PROJECT_DIR = os.path.join(os.path.dirname(os.path.abspath(__file__)),"../")
PROJECT_DIR_PARENT = os.path.join(PROJECT_DIR, "../")
if PROJECT_DIR not in sys.path:
    sys.path.append(PROJECT_DIR)
if PROJECT_DIR_PARENT not in sys.path:
    sys.path.append(PROJECT_DIR_PARENT)

os.environ['CELERY_LOADER'] = 'django'
os.environ['DJANGO_SETTINGS_MODULE'] = 'projectname.settings'

import django.core.handlers.wsgi
application = django.core.handlers.wsgi.WSGIHandler()
application = newrelic.agent.wsgi_application()(application)

We've tried upgrading our current old-style Sentry installation to the Raven/Sentry paradigm, but Nginx reports a 504 (timeout) error when trying to proxy to Apache. However, if I comment out the New Relic-related lines in my WSGI module, it connects beautifully.

KeyError: '__sentry__' in create_from_text

Traceback (most recent call last):
File "/usr/local/lib/python2.6/dist-packages/gunicorn-0.13.1-py2.6.egg/gunicorn/workers/sync.py", line 97, in handle_request
respiter = self.wsgi(environ, resp.start_response)
File "/usr/local/lib/python2.6/dist-packages/django/core/handlers/wsgi.py", line 252, in call
response = middleware_method(request, response)
File "/usr/local/lib/python2.6/dist-packages/raven-0.5-py2.6.egg/raven/contrib/django/middleware.py", line 21, in process_response
result = client.create_from_text('Http 404', request=request, level=logging.INFO, logger='http404')
File "/usr/local/lib/python2.6/dist-packages/raven-0.5-py2.6.egg/raven/base.py", line 263, in create_from_text
**kwargs
File "/usr/local/lib/python2.6/dist-packages/raven-0.5-py2.6.egg/raven/contrib/django/init.py", line 58, in process
kwargs['data']['sentry']['user'] = user_info
KeyError: 'sentry'

You have, on line 35
if 'data' not in kwargs:
kwargs['data'] = {}

But then, on line 58, you reference
kwargs['data']['sentry']['user'] = user_info

You need to set
kwargs['data']['sentry'] = {}
also, before using it.

raven test command raise error

$ raven test

...
Traceback (most recent call last):
File "/mnt/old/share/project/virtualenvs/g5air2/bin/raven", line 8, in
load_entry_point('raven==1.5.0', 'console_scripts', 'raven')()
File "/mnt/old/share/project/virtualenvs/g5air2/lib/python2.7/site-packages/raven/scripts/runner.py", line 58, in main
'user': os.getlogin(),
OSError: [Errno 2] No such file or directory

The solution is that using 'pwd.getpwuid(os.geteuid())[0]' instead of 'os.getlogin()'. the referrence http://www.wlug.org.nz/PythonNotes

Cannot capture exception when used with genshi

When trying to render a genshi template with raven enabled I get the following traceback:

Traceback (most recent call last):
File "/Users/kikidonk/Whatever/env/kp/lib/python2.7/site-packages/flask/app.py", line 1506, in wsgi_app
response = self.make_response(self.handle_exception(e))
File "/Users/kikidonk/Whatever/env/kp/lib/python2.7/site-packages/flask/app.py", line 1181, in handle_exception
got_request_exception.send(self, exception=e)
File "/Users/kikidonk/Whatever/env/kp/lib/python2.7/site-packages/blinker/base.py", line 220, in send
for receiver in self.receivers_for(sender)]
File "/Users/kikidonk/Whatever/env/kp/lib/python2.7/site-packages/raven/contrib/flask/init.py", line 31, in _handle_exception
'app': sender.name,
File "/Users/kikidonk/Whatever/env/kp/lib/python2.7/site-packages/raven/base.py", line 219, in capture
data.update(processor.process(data))
File "/Users/kikidonk/Whatever/env/kp/lib/python2.7/site-packages/raven/processors.py", line 28, in process
for k, v in frame['vars'].iteritems():
AttributeError: 'str' object has no attribute 'iteritems'

It seems that frame['vars'] contains a string...

In utils/stacks.py:149 I see that 'vars': transform(frame.f_locals)

And upon inspection it seems that frame.f_locals is a list with a single item being a dict containing the genshi variables.

I'm guessing the transform sees a list and then stringifies it, but then other code expects it to be a dict (which it really should be).

Maybe genshi does weird stuff with f_locals ?

simplejson

Could it be possible for rave to try loading json or django's simplejson instead of simplejson directly (as a fallback)... since for example me, I don't have simplejson module installed.

Generic processor class

I expect there will be lots of people wanting to sanitize sensitive information while using Sentry. Seems like it may be a good idea to have a generic processor that can be overridden directly with just the keys to mask.

https://github.com/dcramer/raven/blob/master/raven/processors.py

For example:

class MyProcessor(GenericKeyMaskerProcessor):
    masked_keys = ['cc_num', 'password', 'cvn']

I could probably be talked into a pull request for this, if you think the idea is OK.

Capture message fails with UTF-8 Error while checksum.update()

Top level Sentry exception caught - failed creating log record
Message: Test ﹆(´Ѡ`)﹆
Traceback (most recent call last):
File "/env/lib/python2.6/site-packages/raven/handlers/logging.py", line 58, in emit
return self._emit(record)
File "/env/lib/python2.6/site-packages/raven/contrib/django/handlers.py", line 32, in _emit
return super(SentryHandler, self)._emit(record, request=request)
File "/env/lib/python2.6/site-packages/raven/handlers/logging.py", line 114, in _emit
date=date, *_kwargs)
File "/env/lib/python2.6/site-packages/raven/contrib/django/client.py", line 94, in capture
result = super(DjangoClient, self).capture(event_type, *_kwargs)
File "/env/lib/python2.6/site-packages/raven/base.py", line 293, in capture
checksum.update(to_unicode(bit) or '')
UnicodeEncodeError: 'ascii' codec can't encode character u'\ufe46' in position 31: ordinal not in range(128)

Top level Sentry exception: AttributeError: '_Frame' object has no attribute 'f_lineno'

Not sure what's causing this, but trying to log an exception raised in a Celery task results in this log message sequence:

WARNING 2012-02-01 11:56:24,105 log 24218 -1248035984 Top level Sentry exception caught - failed creating log record
WARNING 2012-02-01 11:56:24,106 log 24218 -1248035984 Task %(name)s[%(id)s] raised exception: %(exc)s
%(traceback)s
WARNING 2012-02-01 11:56:24,107 log 24218 -1248035984 Traceback (most recent call last):
File "/usr/local/lib/python2.7/dist-packages/raven/handlers/logging.py", line 58, in emit
return self._emit(record)
File "/usr/local/lib/python2.7/dist-packages/raven/contrib/django/handlers.py", line 32, in _emit
return super(SentryHandler, self)._emit(record, request=request)
File "/usr/local/lib/python2.7/dist-packages/raven/handlers/logging.py", line 106, in _emit
data.update(handler.capture(exc_info=record.exc_info))
File "/usr/local/lib/python2.7/dist-packages/raven/events.py", line 66, in capture
frames = varmap(lambda k, v: shorten(v), get_stack_info(iter_traceback_frames(exc_traceback)))
File "/usr/local/lib/python2.7/dist-packages/raven/utils/stacks.py", line 170, in get_stack_info
lineno = frame.f_lineno - 1
AttributeError: '_Frame' object has no attribute 'f_lineno'

Exception message not logged

Using sentry 3.5.7 and raven 1.4.6, code such as this (using python's logging module):

except:
    log.exception ("foo")

Produces records that contain "foo" and contain the exception's stacktrace, but no exception type or original message.

fresh setup broken in 2.0

Trying to do sentry upgrade on fresh setup with empty sqlite3 db.


Synced:
 > django.contrib.auth
 > django.contrib.admin
 > django.contrib.contenttypes
 > django.contrib.sessions
 > django.contrib.sites
 > djkombu
 > raven.contrib.django
 > south

Not synced (use migrations):
 - sentry
(use ./manage.py migrate to migrate these)
Running migrations for sentry:
 - Migrating forwards to 0036_auto__chg_field_option_value__chg_field_projectoption_value.
 > sentry:0001_initial
Top level Sentry exception caught - failed creating log record
south execute "CREATE TABLE "sentry_groupedmessage" ("id" integer NOT NULL PRIMARY KEY, "logger" varchar(64) NOT NULL DEFAULT 'root', "class_name" varchar(128) NULL, "level" integer unsigned NOT NULL DEFAULT 40, "message" text NOT NULL, "traceback" text NULL, "view" varchar(200) NOT NULL, "url" varchar(200) NULL, "server_name" varchar(128) NOT NULL, "checksum" varchar(32) NOT NULL, "status" integer unsigned NOT NULL DEFAULT 0, "times_seen" integer unsigned NOT NULL DEFAULT 1, "last_seen" datetime NOT NULL DEFAULT '2012-01-27 17:03:53.264545', "first_seen" datetime NOT NULL DEFAULT '2012-01-27 17:03:53.264745');" with params "[]"

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.