Giter Club home page Giter Club logo

newrelic-monolog-logenricher-php's Introduction

Archived header

Monolog components to enable New Relic logs

Latest Stable Version Latest Unstable Version CircleCI License

This package provides the components required to integrate a PHP application using Monolog with New Relic Logs.

Archival Notice

As of June, 2023 the Monolog components to enable New Relic Logs project is archived. The New Relic PHP agent (version 10.3.0 and newer) supports Monolog 2 and Monolog 3 log forwarding automatically and is the recommended way to capture log output from your PHP application. Learn more about automatic log forwarding.

Installation

Components

Three components are provided:

  1. A Handler, which delivers log records directly from Monolog to New Relic Logs.

  2. A Processor. This can be used in conjunction with the New Relic PHP agent to decorate log records with linking metadata, which allows you to use logs-in-context to correlate log records with related data across the New Relic platform.

  3. A Formatter, which extends the JsonFormatter provided by Monolog to take the decorated log records from the Processor and output them with the simplified JSON body structure expected by New Relic Logs and its supported plugins.

Please see Getting Started below for more detail on how to integrate these components with your application.

Requirements

To use the Handler, you will also need the following:

To enable logs-in-context functionality, you will also need:

Install

This package is available on Packagist, and should be installed using Composer:

composer require newrelic/monolog-enricher

Getting Started

Sending logs directly to New Relic Logs

The simplest way to use this package is to use the Processor and Handler to send data directly to New Relic Logs:

<?php

use Monolog\Logger;
use NewRelic\Monolog\Enricher\{Handler, Processor};

$log = new Logger('log');
$log->pushProcessor(new Processor);
$log->pushHandler(new Handler);

$log->info('Hello, world!');

If the New Relic PHP agent is installed, then the Handler should be able to detect the license key from the PHP agent, and the Processor will automatically add linking metadata to log records.

If you do not use New Relic APM, you can skip pushing the processor: the Handler can operate independently.

Selectively sending log records

By default, using the Handler means that each log record will cause a HTTP request to occur to the New Relic Logs API. This may add overhead to your application if a significant number of records are logged.

Like most built-in Monolog handlers, the Handler class allows the specification of a minimum log level: log records below the given level will not be sent to New Relic. Therefore, if you don't want to see logs below WARNING, you could change the instantiation of Handler as follows:

<?php
// ...

$log->pushHandler(new Handler(Logger::WARNING));

Buffering log records to improve performance

Another way of avoiding a HTTP request for each log message that is sent is to use Monolog's built-in BufferHandler to batch log messages, and then send them in one message at the end of the request:

<?php

use Monolog\Handler\BufferHandler;
use Monolog\Logger;
use NewRelic\Monolog\Enricher\{Handler, Processor};

$log = new Logger('log');
$log->pushProcessor(new Processor);
$log->pushHandler(new BufferHandler(new Handler));

$log->info('Hello, world!');

Manually specifying the license key and/or host

The Handler class provides methods to set the license key or the New Relic Log API host that will be used. This may be useful if the New Relic PHP agent is not installed, or if you wish to log to a different account or region.

<?php
// ...

$handler = new Handler;
$handler->setHost('log-api.eu.newrelic.com');
$handler->setLicenseKey('0123456789abcdef0123456789abcdef01234567');
$log->pushHandler($handler);

Integrating with an existing logging tool

If you have a logging tool already configured to send logs to New Relic Logs (such as Fluentd, AWS CloudWatch, or another logging tool supported by New Relic Logs), then you may prefer to use the Processor and Formatter to send logs to that tool, rather than sending logs directly to New Relic using the Handler.

For example, if your logging tool is configured to pick up NDJSON on stderr, you could configure the logger as follows:

<?php

use Monolog\Handler\StreamHandler;
use Monolog\Logger;
use NewRelic\Monolog\Enricher\{Formatter, Processor};

$log = new Logger('log');
$log->pushProcessor(new Processor);

$handler = new StreamHandler('php://stderr');
$handler->setFormatter(new Formatter);
$log->pushHandler($handler);

$log->info('Hello, world!');

More information on configuring your logging tool to send logs to New Relic Logs can be found within the New Relic documentation.

Contribute

As of June, 2023 the Monolog components to enable New Relic Logs project is archived and available for cloning only. We encourage you to experiment with it in your fork however please keep in mind that there is neither a maintainer team nor support.

A note about vulnerabilities

As noted in our security policy, New Relic is committed to the privacy and security of our customers and their data. We believe that providing coordinated disclosure by security researchers and engaging with the security community are important means to achieve our security goals.

If you believe you have found a security vulnerability in this project or any of New Relic's products or websites, we welcome and greatly appreciate you reporting it to New Relic through HackerOne.

To all contributors, we thank you! Without your contribution, this project would not be what it is today.

Setting up a development environment

The development dependencies for this project are managed by Composer, and should be installed via Composer:

composer install

Coding standards

This project conforms to PSR-12, with a soft line length limit of 80 characters.

PHP_CodeSniffer is used to ensure conformity. You can run phpcs to check the current code via the following Composer script:

composer coding-standard-check

Alternatively, you can use phpcbf to automatically fix most errors:

composer coding-standard-fix

When submitting a fix, please also ensure a corresponding entry has been added to the changelog.

Testing

Running unit tests

This project uses PHPUnit 4, which is the last PHPUnit version to support PHP 5.3.

You can run the test suite via Composer:

composer test

If phpdbg is available, you can also generate a code coverage report while running the test suite:

composer test-coverage

This will write a HTML coverage report to coverage/index.html.

Running integration tests

It's also possible to run a suite of integration tests against both Monolog 1 and 2 via Composer:

composer integration

More information on these tests is available in the tests/integration README.

Privacy

At New Relic we take your privacy and the security of your information seriously, and are committed to protecting your information. We must emphasize the importance of not sharing personal data in public forums, and ask all users to scrub logs and diagnostic information for sensitive information, whether personal, proprietary, or otherwise.

We define “Personal Data” as any information relating to an identified or identifiable individual, including, for example, your name, phone number, post code or zip code, Device ID, IP address, and email address.

For more information, review New Relic’s General Data Privacy Notice.

License

newrelic-monolog-logenricher-php is licensed under the Apache 2.0 License.

Resources

newrelic-monolog-logenricher-php's People

Contributors

fahmy-mohammed avatar kneitinger avatar lavarou avatar lawngnome avatar melissaklein24 avatar mfulb avatar paperclypse avatar tangollama avatar zsistla 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

Watchers

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

newrelic-monolog-logenricher-php's Issues

log-api.newrelic.com API calls are taking abnormally long response time

Description

See screenshots:

image

image (1)

As you can see, in most of our webhook calls, log-api.newrelic.com calls take 95% - 99% of response time.

Steps to Reproduce

We have set up this library in our Laravel environment.

Expected Behavior

It shouldn't take that much time for every webhook request.

Your Environment

  • Ubuntu 20.04 LTS
  • Laravel 9.20
  • PHP 8.1

PSR-4 autoloading doesn't work

Description

I've tried using this package with our Symfony 5 installation and could not integrate it cleanly because the autoloading is broken due to the fix for PHP5.

Steps to Reproduce

Take any Symfony installation, composer-require this and try to use it inside a service. It basically doesn't work because the Formatter and Handler classes never end up in the classmap.

Theoretically, this should also fail to work with composer dump-autoload generated files (i.e. the standard autoloading method).

Expected Behaviour

This works with normal PSR-4 autoloading.

Your Environment

PHP 7.2.29 (cli) (built: Mar 20 2020 01:33:13) ( NTS )

monolog/monolog                        1.25.3   Sends your logs to files, sockets, inboxes, databases and various web services
newrelic/monolog-enricher              1.0.0    Monolog components to enable New Relic Logs
symfony/monolog-bridge                 v4.4.5   Symfony Monolog Bridge
symfony/monolog-bundle                 v3.5.0   Symfony MonologBundle

Linux 693af06c9eb9 4.19.76-linuxkit #1 SMP Thu Oct 17 19:31:58 UTC 2019 x86_64 GNU/Linux

v1 incompatible with composer 2

During our update from composer 1 to composer 2 we encountered issues with version 1.0.1 of this library.

Description

composer 1

When running composer dumpautoload -o with composer 1, you get this output:

Generating optimized autoload files
Deprecation Notice: Class NewRelic\Monolog\Enricher\AbstractFormatter located in ./vendor/newrelic/monolog-enricher/src/Formatter.php does not comply with psr-4 autoloading standard. It will not autoload anymore in Composer v2.0. in phar:///tmp/newrelic/composer.phar/src/Composer/Autoload/ClassMapGenerator.php:201
Deprecation Notice: Class NewRelic\Monolog\Enricher\AbstractHandler located in ./vendor/newrelic/monolog-enricher/src/Handler.php does not comply with psr-4 autoloading standard. It will not autoload anymore in Composer v2.0. in phar:///tmp/newrelic/composer.phar/src/Composer/Autoload/ClassMapGenerator.php:201
Generated optimized autoload files containing 122 classes

However, the class map is generated correctly:

grep -R AbstractHandler vendor/composer/autoload*
vendor/composer/autoload_classmap.php:    'Monolog\\Handler\\AbstractHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/AbstractHandler.php',
vendor/composer/autoload_classmap.php:    'NewRelic\\Monolog\\Enricher\\AbstractHandler' => $vendorDir . '/newrelic/monolog-enricher/src/Handler.php',
vendor/composer/autoload_static.php:        'Monolog\\Handler\\AbstractHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/AbstractHandler.php',
vendor/composer/autoload_static.php:        'NewRelic\\Monolog\\Enricher\\AbstractHandler' => __DIR__ . '/..' . '/newrelic/monolog-enricher/src/Handler.php',
grep -R AbstractFormatter vendor/composer/autoload*
vendor/composer/autoload_classmap.php:    'NewRelic\\Monolog\\Enricher\\AbstractFormatter' => $vendorDir . '/newrelic/monolog-enricher/src/Formatter.php',
vendor/composer/autoload_static.php:        'NewRelic\\Monolog\\Enricher\\AbstractFormatter' => __DIR__ . '/..' . '/newrelic/monolog-enricher/src/Formatter.php',

composer 2

When running composer dumpautoload -o with composer 2, you get this output:

Generating optimized autoload files
Class NewRelic\Monolog\Enricher\AbstractFormatter located in ./vendor/newrelic/monolog-enricher/src/Formatter.php does not comply with psr-4 autoloading standard. Skipping.
Class NewRelic\Monolog\Enricher\AbstractHandler located in ./vendor/newrelic/monolog-enricher/src/Handler.php does not comply with psr-4 autoloading standard. Skipping.
Generated optimized autoload files containing 121 classes

The class map is generated without references to the abstract classes:

grep -R AbstractHandler vendor/composer/autoload*
vendor/composer/autoload_classmap.php:    'Monolog\\Handler\\AbstractHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/AbstractHandler.php',
vendor/composer/autoload_static.php:        'Monolog\\Handler\\AbstractHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/AbstractHandler.php',
grep -R AbstractFormatter vendor/composer/autoload*

Steps to Reproduce

use composer 1 or 2 (see above)

composer require newrelic/monolog-enricher:1.0.1
composer dumpautoload -o

Expected Behaviour

No deprecation warnings with composer 1/2 and a complete optimized class map with composer 2.

Relevant Logs / Code Samples

Your Environment

PHP 8.0.2 (cli) (built: Feb 23 2021 14:52:59) ( NTS )

monolog/monolog 2.3.5 Sends your logs to files, sockets, inboxes, databases and various web services
newrelic/monolog-enricher 1.0.1 Monolog components to enable New Relic Logs

Linux AUX-LAP-200 5.4.0-90-generic #101-Ubuntu SMP Fri Oct 15 20:00:55 UTC 2021 x86_64 x86_64 x86_64 GNU/Linux

DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=20.04
DISTRIB_CODENAME=focal
DISTRIB_DESCRIPTION="Ubuntu 20.04.3 LTS"

Additional context

support for monolog v3

Summary

Create a new version that supports monolog/monolog version 3. Currently a framework like laravel could not be upgraded to version 10 cause that needs monolog version 3 and the current vesrion of newrelic-monolog-logenricher does not allow this.

No logs are sent when records are filtered out

Description

I have set a log level like so:

services:
    NewRelic\Monolog\Enricher\Handler:
        arguments:
            $level: !php/const Monolog\Logger::INFO

As soon as this $level will filter one element out of the log records, it will not log anything in NewRelic.
Exception: Only when a log is filtered from the end of the log records, it will still work.

Reason for that is, that json_encode will act different, if an array does not have a "natural" order of indexes. The problem is is demonstrated here:
https://onlinephp.io/c/14d33

Steps to Reproduce

services:
    NewRelic\Monolog\Enricher\Processor:
        tags:
            - { name: monolog.processor }

    NewRelic\Monolog\Enricher\Handler:
        arguments:
            $level: !php/const Monolog\Logger::INFO

    newrelic_fingers_crossed:
        class: Monolog\Handler\FingersCrossedHandler
        arguments:
            $handler: '@NewRelic\Monolog\Enricher\Handler'
monolog:
   handlers:
       handler_newrelic_fingers_crossed:
            type: service
            id: newrelic_fingers_crossed

Expected Behaviour

That the logs are sent to NewRelic, even if a record was filtered out.

Your Environment

PHP 8.0.12 (cli) (built: Nov 17 2021 19:53:29) ( NTS )

monolog/monolog 2.3.5 Sends your logs to files, sockets, inboxes, databases and various web services
newrelic/monolog-enricher 2.0.0 Monolog components to enable New Relic Logs
symfony/monolog-bridge v5.3.7 Provides integration for Monolog with various Symfony components
symfony/monolog-bundle v3.7.0 Symfony MonologBundle

Linux 1171274930e2 5.19.0-40-generic #41~22.04.1-Ubuntu SMP PREEMPT_DYNAMIC Fri Mar 31 16:00:14 UTC 2 x86_64 GNU/Linux

[Repolinter] Open Source Policy Issues

Repolinter Report

🤖This issue was automatically generated by repolinter-action, developed by the Open Source and Developer Advocacy team at New Relic. This issue will be automatically updated or closed when changes are pushed. If you have any problems with this tool, please feel free to open a GitHub issue or give us a ping in #help-opensource.

This Repolinter run generated the following results:

❗ Error ❌ Fail ⚠️ Warn ✅ Pass Ignored Total
0 0 1 6 0 7

Warning #

Click to see rules

⚠️ third-party-notices-file-exists #

A THIRD_PARTY_NOTICES.md file can be present in your repository to grant attribution to all dependencies being used by this project. This document is necessary if you are using third-party source code in your project, with the exception of code referenced outside the project's compiled/bundled binary (ex. some Java projects require modules to be pre-installed in the classpath, outside the project binary and therefore outside the scope of the THIRD_PARTY_NOTICES). Please review your project's dependencies and create a THIRD_PARTY_NOTICES.md file if necessary. For JavaScript projects, you can generate this file using the oss-cli. For more information please visit https://docs.google.com/document/d/1y644Pwi82kasNP5VPVjDV8rsmkBKclQVHFkz8pwRUtE/view. Did not find a file matching the specified patterns. Below is a list of files or patterns that failed:

  • THIRD_PARTY_NOTICES*
  • THIRD-PARTY-NOTICES*
  • THIRDPARTYNOTICES*

Passed #

Click to see rules

license-file-exists #

Found file (LICENSE). New Relic requires that all open source projects have an associated license contained within the project. This license must be permissive (e.g. non-viral or copyleft), and we recommend Apache 2.0 for most use cases. For more information please visit https://docs.google.com/document/d/1vML4aY_czsY0URu2yiP3xLAKYufNrKsc7o4kjuegpDw/edit.

readme-file-exists #

Found file (README.md). New Relic requires a README file in all projects. This README should give a general overview of the project, and should point to additional resources (security, contributing, etc.) where developers and users can learn further. For more information please visit https://github.com/newrelic/open-by-default.

readme-starts-with-community-plus-header #

The first 5 lines contain all of the requested patterns. (README.md). The README of a community plus project should have a community plus header at the start of the README. If you already have a community plus header and this rule is failing, your header may be out of date, and you should update your header with the suggested one below. For more information please visit https://opensource.newrelic.com/oss-category/.

readme-contains-link-to-security-policy #

Contains a link to the security policy for this repository (README.md). New Relic recommends putting a link to the open source security policy for your project (https://github.com/newrelic/<repo-name>/security/policy or ../../security/policy) in the README. For an example of this, please see the "a note about vulnerabilities" section of the Open By Default repository. For more information please visit https://nerdlife.datanerd.us/new-relic/security-guidelines-for-publishing-source-code.

readme-contains-discuss-topic #

Contains a link to the appropriate discuss.newrelic.com topic (README.md). New Relic recommends directly linking the your appropriate discuss.newrelic.com topic in the README, allowing developer an alternate method of getting support. For more information please visit https://nerdlife.datanerd.us/new-relic/security-guidelines-for-publishing-source-code.

code-of-conduct-should-not-exist-here #

New Relic has moved the CODE_OF_CONDUCT file to a centralized location where it is referenced automatically by every repository in the New Relic organization. Because of this change, any other CODE_OF_CONDUCT file in a repository is now redundant and should be removed. Note that you will need to adjust any links to the local CODE_OF_CONDUCT file in your documentation to point to the central file (README and CONTRIBUTING will probably have links that need updating). For more information please visit https://docs.google.com/document/d/1y644Pwi82kasNP5VPVjDV8rsmkBKclQVHFkz8pwRUtE/view. Did not find a file matching the specified patterns. All files passed this test.

Bug or mistake in AbstractHandler::sendBatch

Description

In troubleshooting why my setup didn't seem to be working, I ended up seeing the following code:
https://github.com/newrelic/newrelic-monolog-logenricher-php/blob/master/src/AbstractHandler.php#L133...L135

        $postData = '[{"logs":' . $data . '}]';

        curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
        curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
        Curl\Util::execute($ch, 5, false);
    }

$postData is not used, and I'm wondering if this is correct or could be causing problems (I'll keep investigating my problem separately).

Your Environment

PHP: 7.4
OS: osx 11.3.1
Monolog: 2.2.0 (via laravel)

Set environment

Summary

Create function for set environment of application.
example: setApplicationEnv

Update phpunit version to get rid of vulnerability CVE-2017-9841

Summary

Please update composer.json to use phpunit ideally at latest version to avoid tools like AquaScan and similar reports composer.lock situated in this package inside tests folder and critical vulnerability.

Desired Behaviour

Last version of phpunit used in composer.json or at least version with fixes for announced vulnerability.

Possible Solution

Update composer.json.

Monolog dependency is incorrect

Description

NewRelic\Monolog\Enricher implements the Monolog ProcessorInterface yet that was not introduced until version 1.24.0 of Monolog

Steps to Reproduce

composer require "newrelic/monolog-enricher": "^1.0"
On a project that includes version 1.23.0 or older of Monolog

Expected Behaviour

Composer would fail due to an unresolvable set of packages

Relevant Logs / Code Samples

https://github.com/newrelic/newrelic-monolog-logenricher-php/blob/master/src/Processor.php#L16
Seldaek/monolog@db8130c

Your Environment

PHP 7.1.33-16+0~20200514.38+debian10~1.gbp1e5820 (cli) (built: May 14 2020 13:41:21) ( NTS )

monolog/monolog                               1.16.0                     Sends your logs to files, sockets, inboxes, databases and various web services
newrelic/monolog-enricher                     1.0.0                      Monolog components to enable New Relic Logs

Linux DESKTOP-QTD0K0G 4.4.0-18362-Microsoft #836-Microsoft Mon May 05 16:04:00 PST 2020 x86_64 GNU/Linux

Additional context

[Repolinter] Open Source Policy Issues

Repolinter Report

🤖This issue was automatically generated by repolinter-action, developed by the Open Source and Developer Advocacy team at New Relic. This issue will be automatically updated or closed when changes are pushed. If you have any problems with this tool, please feel free to open a GitHub issue or give us a ping in #help-opensource.

This Repolinter run generated the following results:

❗ Error ❌ Fail ⚠️ Warn ✅ Pass Ignored Total
0 2 1 4 0 7

Fail #

readme-starts-with-community-plus-header #

The README of a community plus project should have a community plus header at the start of the README. If you already have a community plus header and this rule is failing, your header may be out of date, and you should update your header with the suggested one below. For more information please visit https://opensource.newrelic.com/oss-category/. Below is a list of files or patterns that failed:

  • README.md: The first 5 lines do not contain the pattern(s): Open source Community Plus header (see https://opensource.newrelic.com/oss-category).
    • 🔨 Suggested Fix: prepend the latest code snippet found at https://github.com/newrelic/opensource-website/wiki/Open-Source-Category-Snippets#code-snippet-2 to file

readme-contains-forum-topic #

Doesn't contain a link to the appropriate forum.newrelic.com topic (README.md). New Relic recommends directly linking the your appropriate forum.newrelic.com topic in the README, allowing developer an alternate method of getting support. For more information please visit https://nerdlife.datanerd.us/new-relic/security-guidelines-for-publishing-source-code.

Warning #

Click to see rules

⚠️ third-party-notices-file-exists #

A THIRD_PARTY_NOTICES.md file can be present in your repository to grant attribution to all dependencies being used by this project. This document is necessary if you are using third-party source code in your project, with the exception of code referenced outside the project's compiled/bundled binary (ex. some Java projects require modules to be pre-installed in the classpath, outside the project binary and therefore outside the scope of the THIRD_PARTY_NOTICES). Please review your project's dependencies and create a THIRD_PARTY_NOTICES.md file if necessary. For JavaScript projects, you can generate this file using the oss-cli. For more information please visit https://docs.google.com/document/d/1y644Pwi82kasNP5VPVjDV8rsmkBKclQVHFkz8pwRUtE/view. Did not find a file matching the specified patterns. Below is a list of files or patterns that failed:

  • THIRD_PARTY_NOTICES*
  • THIRD-PARTY-NOTICES*
  • THIRDPARTYNOTICES*

Passed #

Click to see rules

license-file-exists #

Found file (LICENSE). New Relic requires that all open source projects have an associated license contained within the project. This license must be permissive (e.g. non-viral or copyleft), and we recommend Apache 2.0 for most use cases. For more information please visit https://docs.google.com/document/d/1vML4aY_czsY0URu2yiP3xLAKYufNrKsc7o4kjuegpDw/edit.

readme-file-exists #

Found file (README.md). New Relic requires a README file in all projects. This README should give a general overview of the project, and should point to additional resources (security, contributing, etc.) where developers and users can learn further. For more information please visit https://github.com/newrelic/open-by-default.

readme-contains-link-to-security-policy #

Contains a link to the security policy for this repository (README.md). New Relic recommends putting a link to the open source security policy for your project (https://github.com/newrelic/<repo-name>/security/policy or ../../security/policy) in the README. For an example of this, please see the "a note about vulnerabilities" section of the Open By Default repository. For more information please visit https://nerdlife.datanerd.us/new-relic/security-guidelines-for-publishing-source-code.

code-of-conduct-should-not-exist-here #

New Relic has moved the CODE_OF_CONDUCT file to a centralized location where it is referenced automatically by every repository in the New Relic organization. Because of this change, any other CODE_OF_CONDUCT file in a repository is now redundant and should be removed. Note that you will need to adjust any links to the local CODE_OF_CONDUCT file in your documentation to point to the central file (README and CONTRIBUTING will probably have links that need updating). For more information please visit https://docs.google.com/document/d/1y644Pwi82kasNP5VPVjDV8rsmkBKclQVHFkz8pwRUtE/view. Did not find a file matching the specified patterns. All files passed this test.

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.