Coder Social home page Coder Social logo

openzipkin-contrib / zipkin-go-opentracing Goto Github PK

View Code? Open in Web Editor NEW
509.0 26.0 100.0 338 KB

OpenTracing Bridge for Zipkin Go

License: Apache License 2.0

Go 99.23% Makefile 0.77%
zipkin instrumentation go opentracing tracing trace distributed-tracing openzipkin

zipkin-go-opentracing's People

Contributors

basvanbeek avatar bhs avatar buptmiao avatar ccl0326 avatar damoye avatar ddtmachado avatar hkshaw1990 avatar jawshua avatar jcchavezs avatar mandarjog avatar nmiyake avatar nvanbenschoten avatar nwest1 avatar odeke-em avatar posener avatar primalmotion avatar richardmarshall avatar tomwilkie avatar zackbutcher 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

zipkin-go-opentracing's Issues

add http collector

Currently this tracer has collectors for Kafka and Scribe but for easier adoption of Zipkin it would be good to also have an HTTP collector

_thrift directory ignored by gvt

I tried to install zipkin-go-opentracing with gvt, and was surprised to find the _thrift directory missing from the checkout.

After some searching, I found that gvt has some logic to ignore directories beginning with _. They justify this by linking to golang's description of package lists which states:

Directory and file names that begin with "." or "_" are ignored by the go tool, as are directories named "testdata".

Perhaps it would be a good idea to remove the underscore from the _thrift directory in this package. If you think this is something that should be allowed by gvt please let me know, and I'd be happy to open a ticket with them.

Regards,
Igor

Package is broken against github.com/apache/thrift/lib/go/thrift

blep ~/src/github.com/go-kit/kit (master) go get -u -v github.com/openzipkin/zipkin-go-opentracing/...
 ...
 ...
 ...
github.com/openzipkin/zipkin-go-opentracing/thrift/gen-go/scribe
# github.com/openzipkin/zipkin-go-opentracing/thrift/gen-go/scribe
../../openzipkin/zipkin-go-opentracing/thrift/gen-go/scribe/scribe.go:147:28: cannot use scribeProcessorLog literal (type *scribeProcessorLog) as type thrift.TProcessorFunction in assignment:
        *scribeProcessorLog does not implement thrift.TProcessorFunction (wrong type for Process method)
                have Process(int32, thrift.TProtocol, thrift.TProtocol) (bool, thrift.TException)
                want Process(context.Context, int32, thrift.TProtocol, thrift.TProtocol) (bool, thrift.TException)
../../openzipkin/zipkin-go-opentracing/thrift/gen-go/scribe/scribe.go:157:27: not enough arguments in call to processor.Process
        have (int32, thrift.TProtocol, thrift.TProtocol)
        want (context.Context, int32, thrift.TProtocol, thrift.TProtocol)

Not capable with brave librery

brave and other zipkin libs can create id with minus and int.
Go zipkin use only uint type that means we can not use id with minus

IPv6 support

We currently support logging of only IPv4 addresses. Starting with Zipkin 1.4 endpoints can omit IPv4 (by setting Endpoint.ipv4 to 0), and optionally log Endpoint.ipv6 as the raw 16byte address.
https://github.com/openzipkin/zipkin-api/blob/master/thrift/zipkinCore.thrift#L276

In json, both are the string formatting http://zipkin.io/zipkin-api

ipv4:
string
The text representation of a IPv4 address associated with this endpoint. Ex. 192.168.99.100
ipv6:
string
The text representation of a IPv6 address associated with this endpoint. Ex. 2001:db8::c001

error occurs when build example because of thrift

I'm trying to build example and run. Found some errors and need help to fix.

When depends on github.com/apache/thrift @ 0.10.0 (which is the lastest version tag). The build result is below
image

and then goto line 333 of github.com/openzipkin/zipkin-go-opentracing/thrift/gen-go/scribe/scribe.go
image

the type of self2.processorMap is thrift.TProcessorFunction. And the definition of thrift.TProcessorFunction in github.com/apache/thrift @ 0.10.0 is below
image

But the Process function's implemention in scribeProcessorLog is defined like this
image

can not compile code with undefined: proto.GoGoProtoPackageIsVersion2 bug

HI, I come across some error issue when compile code with go get ., details is below

# github.com/openzipkin/zipkin-go-opentracing/wire
wire/wire.pb.go:31: undefined: proto.GoGoProtoPackageIsVersion2
wire/wire.pb.go:582: undefined: proto.RegisterFile
godep: exit status 2

also proto.GoGoProtoPackageIsVersion2 can not be found in github.com/golang/protobuf project after pull all dependent codes.
any one who can help me fix this issue, thanks.

Dependencies & DependencyLink

Hi there,
any reason why the generated Go code for zipkinDependencies.thrift wasn't included under thrift/gen-go/zipkincore?

loop in scribe collector infinitely spawns send() goroutines

If the send() method blocks (e.g. because of network), the loop() method continues to spawn goroutines indefinitely. The problem is that the currentBatchSize >= c.batchSize condition will always be true if a send() is blocked (collector-scribe.go#L147).

I think this is a broken behaviour, and could be easily fixed, probably by not allowing another send() to be spawned if one is already running. I'm up for doing a PR if the maintainers agree this should be fixed.

textMapPropagator breaks span after inject

Hi. Seems that textMapPropagator breaks span after it being injected
https://github.com/openzipkin/zipkin-go-opentracing/blob/master/propagation_ot.go#L54

carrier.Set(zipkinTraceID, strconv.FormatUint(sc.raw.TraceID, 16))
    carrier.Set(zipkinSpanID, strconv.FormatUint(sc.raw.SpanID, 16))
    if !p.tracer.options.clientServerSameSpan {
        sc.raw.ParentSpanID = 0
    }
    carrier.Set(zipkinParentSpanID, strconv.FormatUint(sc.raw.ParentSpanID, 16))
    carrier.Set(zipkinSampled, strconv.FormatBool(sc.raw.Sampled))

sc is pointer, so if clientServerSameSpan option is equal false (it`s equal to false by default) then we remove parentSpanID from this span.

Comparing with https://github.com/openzipkin/zipkin-go-opentracing/blob/master/propagation.go#L36 there parentSpanID=0 is only passed to carrier, so it doesn`t affect span.

This error can be reproduced if request depth is more then 2:

service1 (spanID: 1, parentSpanID: 0) -> service2 (spanID: 2, parentSpanID: 1)
service1 (spanID: 1, parentSpanID: 0) -> service2 (spanID: 3, parentSpanID: 1)
service2 (spanID: 3, parentSpanID: 1) -> service3 (spanID: 4, parentSpanID: 3)

But after injecting spanID:3 it`s parentID becomes 0 and it becomes root span like as spanID.

I can send PR for fix this issue if you want.

Thrift issues still?

I see there's a closed issue that looks exactly the same as this, I've literally just installed thrift and trying to go get this package but it's not working out.

~/go/src/git.neds.sh/finance/user $ go get -u github.com/openzipkin/zipkin-go-opentracing
# github.com/openzipkin/zipkin-go-opentracing/thrift/gen-go/scribe
../../../github.com/openzipkin/zipkin-go-opentracing/thrift/gen-go/scribe/scribe.go:282:14: not enough arguments in call to oprot.Flush
	have ()
	want (context.Context)
../../../github.com/openzipkin/zipkin-go-opentracing/thrift/gen-go/scribe/scribe.go:299:16: not enough arguments in call to oprot.Flush
	have ()
	want (context.Context)
../../../github.com/openzipkin/zipkin-go-opentracing/thrift/gen-go/scribe/scribe.go:312:16: not enough arguments in call to oprot.Flush
	have ()
	want (context.Context)
../../../github.com/openzipkin/zipkin-go-opentracing/thrift/gen-go/scribe/scribe.go:326:24: not enough arguments in call to oprot.Flush
	have ()
	want (context.Context)

Am I doing something wrong?

V0.2.2 not compatible with 1.0.0 of opentracing-go

V0.2.2 of this repo is not compatible with 1.0.0 of opentracing-go because fields do not have any method named Key() and Value() which is used here https://github.com/openzipkin/zipkin-go-opentracing/blob/v0.2.2/log-materializers.go#L54.

I get following error:

go/src/github.com/openzipkin/zipkin-go-opentracing/log-materializers.go:54: field.Key undefined (type "github.com/opentracing/opentracing-go/log".Field has no field or method Key, but does have "github.com/opentracing/opentracing-go/log".key)

go/src/github.com/openzipkin/zipkin-go-opentracing/log-materializers.go:54: field.Value undefined (type "vendor/github.com/opentracing/opentracing-go/log".Field has no field or method Value)

However master of both repos are compatible with each other. As convenience methods were added back to opentracing-go in this PR

@basvanbeek @bensigelman How about releasing a minor patch for opentracing-go since the methods are added back.

Can't build master

~/go/src/github.com/openzipkin/zipkin-go-opentracing (master)$ go build
# github.com/openzipkin/zipkin-go-opentracing/thrift/gen-go/scribe
thrift/gen-go/scribe/scribe.go:333: cannot use scribeProcessorLog literal (type *scribeProcessorLog) as type thrift.TProcessorFunction in assignment:
	*scribeProcessorLog does not implement thrift.TProcessorFunction (wrong type for Process method)
		have Process(context.Context, int32, thrift.TProtocol, thrift.TProtocol) (bool, thrift.TException)
		want Process(int32, thrift.TProtocol, thrift.TProtocol) (bool, thrift.TException)
thrift/gen-go/scribe/scribe.go:341: too many arguments in call to processor.Process
	have (context.Context, int32, thrift.TProtocol, thrift.TProtocol)
	want (int32, thrift.TProtocol, thrift.TProtocol)

Sampling logic error? x-b3-flags / x-b3-sampled logic question

Hi-
Quoting https://github.com/openzipkin/b3-propagation/#debug-flag-1

Debug is encoded as X-B3-Flags: 1. Debug implies an accept decision: don't also send X-B3-Sampled: 1.

Though https://github.com/openzipkin/zipkin-go-opentracing/blob/master/zipkin-recorder.go#L86 only checks the Sampled flag.

Should there be additional logic added to accept(sample) traces flagged as debug? I can create a PR, but maybe my understanding of this is incorrect.

Thank you!

API to wait for spans to finish sending

Would it be feasible to expose a means of waiting for the spans to finish sending? I'm experimenting with a little CLI tool I wrote, and I presently have to throw in a 1 second sleep in order for the top-most span to arrive at Zipkin.

link to this from opentracing.io once it's considered semantically correct

@basvanbeek I just came across this the other day -- thank you for doing the work!

This issue is really a glorified email message.

What's the state of this repo from a correctness standpoint? If it's working well, I'd like to make note of it at opentracing.io and use it as the basis for similar libs in Java, python, etc.

I will happily do the work on the opentracing.io side once you give the high sign.

Thanks again!

Java/Go Zipkin API's

Hi,

So I am trying to build a multi-language tracing system that works on Java and Go. The Java API's are working and propagating trace data through HTTP headers, but the GO api is unable to get the span context from the parent Java api. The GO api is able to send basic spans to Zipkin (without propagated traceId and parentId) and I can get the HTTP header being sent to the GO API, but I can't seem to manually set the zipkintracer.Span fields for traceId/parentSpanId. Any clues?

Thrift error

Hello!
I've use master branch of zipkin-go-opentracing and got this message while build my project:
vendor/github.com/openzipkin/zipkin-go-opentracing/thrift/gen-go/scribe/scribe.go:210:5: undefined: thrift.TClient

In latest apache thrift release (v0.10.0) TClient was not found.

collector-http: malformed Log call

This line looks wrong:

183		c.logger.Log("Backlog too long, disposing spans.", "count", dispose)

From the wrappedLogger implementation, it looks like the arguments should be alternating key-values (by the way, this should ideally be documented inside the Logger interface definition).

Not existing package inside the openzipkin/zipkin-go-opentracing/propagation_ot.go

I see this error message when I try to compile my project: ../../openzipkin/zipkin-go-opentracing/propagation_ot.go:9:2: cannot find package "github.com/gogo/protobuf/proto" in any of:
/usr/local/Cellar/go/1.8_1/libexec/src/github.com/gogo/protobuf/proto (from $GOROOT)

and as I can see that repository github.com/gogo/protobuf/proto doesn't exists under github.

Basic Go API using Zipkin

Hi, so I'm trying to implement a basic GO api using the go-opentracing, but there are like no examples that I have been able to find. Do you know of any good examples to base my API off of? I'm trying to use the scribe collector and its compiling fine, but none of my spans/traces are being sent to the Zipkin collector. I've included my code in case anybody might be able to debug any glaring mistakes. Appreciate any help!

c, err := zipkintracer.NewScribeCollector("dockerhost:9042",timeout,zipkintracer.ScribeBatchSize(1),zipkintracer.ScribeBatchInterval(batchInterval))
if err != nil {
log.Fatal(err)
}
span := zipkincore.NewSpan()
span.ID = int64(999)
span.TraceID = int64(999)
span.Name = "test"

annotate1 := zipkincore.NewAnnotation()
sr := zipkincore.NewEndpoint()
sr.Ipv4 = (127 << 24) | 1
sr.Port = 8181
annotate1.Host = sr
annotate1.Timestamp = time.Now().UnixNano() / 1e3
annotate1.Value = "test"


annotations := []*zipkincore.Annotation{
    annotate1,
}
binAnnotations := []*zipkincore.BinaryAnnotation{
    binAnnotate,
}
var dur = int64(100)
span.Duration = &dur
span.Annotations = annotations
span.BinaryAnnotations = binAnnotations

c.Collect(span)

Use correct Thrift import path

Auto-generated Thrift code uses the official import path of git.apache.org/thrift.git/lib/go/thrift, but zipkin-go-opentracing uses the GitHub mirror at github.com/apache/thrift/lib/go/thrift. These are distinctly different packages that are similar in contents, but not actually the same: "An import path is a string that uniquely identifies a package." (emphasis mine)

For example, this means that structures and other types defined in the GitHub.com mirror are distinctly different from the official package.

I realize this has been raised and discussed in previous issues for this project, but this can lead to some interesting bugs if one is not observant of this fact, such as the example seen below:

package main

import (
	"fmt"

	"git.apache.org/thrift.git/lib/go/thrift"
	thrift2 "github.com/apache/thrift/lib/go/thrift"
)

func main() {
	bp := thrift.TBinaryProtocol{}
	var iface interface{} = bp

	_, apache := iface.(thrift.TBinaryProtocol)
	_, github := iface.(thrift2.TBinaryProtocol)

	// will print: apache: true; github: false
	fmt.Printf("apache: %v; github: %v", apache, github)
}

The example indicates the TBinaryProtocol interface exposed by GitHub is a different type from the official Apache mirror one.

Many of our developers use IntelliJ / GoLand IDE which has autocomplete features. Some of them are new to Thrift and/or Go and in the past have sometimes accidentally imported the GitHub package instead of the official Apache package. That puts us at risk of bugs like the one illustrated above. zipkin-go-opentracing is a blocker for us to purge the github.com mirror package completely, because it forces us to have both Thrift packages present (and therefore available to autocomplete, and therefore a trap waiting to ensnare the unwary user).

Given that auto-generated Thrift code uses git.apache.org/thrift.git/lib/go/thrift at https://github.com/apache/thrift/blob/88591e32e710a0524327153c8b629d5b461e35e0/compiler/cpp/src/thrift/generate/t_go_generator.cc#L64 - would zipkin-go-opentracing be open to switching back to the official package given the bugs / code correctness problems that using an alternate mirror package can raise?

`collector-http/Collect` can block application

Hi,

In the collector-http.go:
When zipkin is down or slow, the blocking send function can take up to c.client.Timeout seconds. in this period, the Collect function can block the application, because the select in the loop function does not extract spans from the spanc.

I think that running the code inside the collect function in a go routine might solve this problem.

Cheers,
Eyal

benchmarks: seemingly copy and paste errors

zipkin http header keys in canonical format

Hi,
we are experimenting go-kit micro service with openzipkin/zipkin-go-opentracing. One thing I found is that the HTTP header keys like "X-B3-TraceId, X-B3-SpanId, X-B3-ParentSpanId" according to http://zipkin.io/pages/instrumenting.html BECOMES "X-B3-Traceid, X-B3-Spanid, X-B3-Parentspanid" when the http header is sent from go-kit micro service using zipkin-go-opentracing.
While this is fine for tracing between go-kit micro services because the Extract() method of zipkin-go-opentracing/propagation_ot.go resolves the case difference.
However, when the go-kit micro service sends requests with trace to other services implemented in Java or C/C++, the canonical format could create mismatch.
I believe whoever implemented the Extract() method of zipkin-go-opentracing/propagation_ot.go understands the issue I'm talking about.
Any idea on how to resolve this discrepancy between zipkin instruments implemented by different languages?

thanks

Master build failed

It reports

# github.com/openzipkin/zipkin-go-opentracing/wire
../../../github.com/openzipkin/zipkin-go-opentracing/wire/wire.pb.go:31: undefined: proto.GoGoProtoPackageIsVersion2
../../../github.com/openzipkin/zipkin-go-opentracing/wire/wire.pb.go:98: undefined: proto.RegisterType
../../../github.com/openzipkin/zipkin-go-opentracing/wire/wire.pb.go:624: undefined: proto.RegisterFile

Application using zipkin and kafka collector becomes very slow when kafka is down

I was trying to setup zipkin in my production environment. Am using c# and golang clients of zipkin (zipkin4net & zipkin-go-opentracing).
Also have setup kafka as the collector and cassandra as the storage.
As zipkin is just used as a monitoring tool I would want it to work for small intervals.
The problem is that while testing I stopped kafka for sometime to see if the apps are working fine. The c# apps kept working properly but the one with golang became very slow after submitting some spans (probably because it could not reach kafka).

Also it occasionally gives a panic error during sending the span to zipkin in the RecordSpan function of zipkin-recorder.go file. Its the last line of the function.

_ = r.collector.Collect(span)

I think the spans should be dropped if kafka is not reachable.

Am using kafka 0.10.1

Problem with non-string tag value

If I set tag by following code:

span.SetTag("http.status_code", 200)

then I can observe it in zipkin UI (as span tags), but search by query "http.status_code=200" find nothing, and I can not construct any query to find this (or similar) span.

If I set tag by following code

span.SetTag("http.status_code", "200")

then I can find it by in zipkin UI by query "http.status_code=200"

New Thrift, new errors

Via Go kit.

# github.com/openzipkin/zipkin-go-opentracing/thrift/gen-go/scribe
../../openzipkin/zipkin-go-opentracing/thrift/gen-go/scribe/scribe.go:282:14: not enough arguments in call to oprot.Flush
	have ()
	want (context.Context)
../../openzipkin/zipkin-go-opentracing/thrift/gen-go/scribe/scribe.go:299:16: not enough arguments in call to oprot.Flush
	have ()
	want (context.Context)
../../openzipkin/zipkin-go-opentracing/thrift/gen-go/scribe/scribe.go:312:16: not enough arguments in call to oprot.Flush
	have ()
	want (context.Context)
../../openzipkin/zipkin-go-opentracing/thrift/gen-go/scribe/scribe.go:326:24: not enough arguments in call to oprot.Flush
	have ()
	want (context.Context)

http-collector pass authorization headers

Hello,

Could you please tell me, is there any way to add autorizhation headers in http-collector. When making requests to zipkin tool I need to send 2 headers with my request, how to add them?

Move to `openzipkin-contrib`

Given that we have a core repository zipkin-go this should be move to openzipkin-contrib in order to have clarity about what is the zipkin core and what is not.

Ping @openzipkin/core

HTTPCollector. send goroutine only increase without decreasing

goroutine profile: total 231
206 @ 0x4034f04 0x4034fc3 0x40464e3 0x404626d 0x406e3bd 0x4b5e5b4 0x4065341

0x404626c sync.runtime_SemacquireMutex+0x3c /usr/local/go/src/runtime/sema.go:71

0x406e3bc sync.(*Mutex).Lock+0x25c /usr/local/go/src/sync/mutex.go:134

0x4b5e5b3 github.com/openzipkin/zipkin-go-opentracing.(*HTTPCollector).send+0x53 /Users/heldiam/Developer/GO/src/github.com/openzipkin/zipkin-go-opentracing/collector-http.go:192

==================================================================

goroutine profile: total 254
229 @ 0x4034f04 0x4034fc3 0x40464e3 0x404626d 0x406e3bd 0x4b5e5b4 0x4065341

0x404626c sync.runtime_SemacquireMutex+0x3c /usr/local/go/src/runtime/sema.go:71

0x406e3bc sync.(*Mutex).Lock+0x25c /usr/local/go/src/sync/mutex.go:134

0x4b5e5b3 github.com/openzipkin/zipkin-go-opentracing.(*HTTPCollector).send+0x53 /Users/heldiam/Developer/GO/src/github.com/openzipkin/zipkin-go-opentracing/collector-http.go:192

==================================================================

goroutine profile: total 262
237 @ 0x4034f04 0x4034fc3 0x40464e3 0x404626d 0x406e3bd 0x4b5e5b4 0x4065341

0x404626c sync.runtime_SemacquireMutex+0x3c /usr/local/go/src/runtime/sema.go:71

0x406e3bc sync.(*Mutex).Lock+0x25c /usr/local/go/src/sync/mutex.go:134

0x4b5e5b3 github.com/openzipkin/zipkin-go-opentracing.(*HTTPCollector).send+0x53 /Users/heldiam/Developer/GO/src/github.com/openzipkin/zipkin-go-opentracing/collector-http.go:192

why goroutine only increase without decreasing

collector-http connection error log is too verbose

When upstream server is causing client errors on c.client.Do, HTTPCollector logs an error on every request that fails.

To my opinion this is too verbose. The client may have a state and can log only when the state changes.
This is clear enough and don't cause log spamming when upstream server is in error state.

Please give your opinion on this.

Cheers

improved readme

project needs improved readme with examples of zipkin tracer specific settings like ClientServerSameSpan

field.Key undefined

When using zipkin.NewTracer(zipkin.NewRecorder(collector, false, hostPort, svcName))
Inside the log-materializers.go, on the following functions:

// MaterializeWithLogFmt converts log Fields into LogFmt string
func MaterializeWithLogFmt(logFields []log.Field) ([]byte, error) {
	var (
		buffer  = bytes.NewBuffer(nil)
		encoder = logfmt.NewEncoder(buffer)
	)
	for _, field := range logFields {
		if err := encoder.EncodeKeyval(field.Key(), field.Value()); err != nil {
			encoder.EncodeKeyval(field.Key(), err.Error())
		}
	}
	return buffer.Bytes(), nil
}
// StrictZipkinMaterializer will only record a log.Field of type "event".
func StrictZipkinMaterializer(logFields []log.Field) ([]byte, error) {
	for _, field := range logFields {
		if field.Key() == "event" {
			return []byte(fmt.Sprintf("%+v", field.Value())), nil
		}
	}
	return nil, errEventLogNotFound
}

I am getting the following error:
field.Key undefined (type "vendor/github.com/opentracing/opentracing-go/log".Field has no field or method Key, but does have "vendor/github.com/opentracing/opentracing-go/log".key)

This makes sense because as I look at the []log.Field, I see that the Field struct does not have a method called Key() which is exposing the key...

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.