Skip to content

Repository files navigation

OpenTelemetry Package for the Gorm ORM

This package is meant to simplify wrapping Gorm requests to databases with OpenTelemetry Tracing Spans. The functionality within the package is as of OpenTelemetry-go v0.2.1 and is subject to change fairly rapidly as the standard is evolved.

This package is B.Y.O.E. (Bring Your Own Exporter)

Metrics support coming soon!

Example Usage

Make sure you have the following:

  • Docker
  • Go 1.13
  • cURL or Postman for testing

Run the following commands to create the testing environment:

  • docker run -d -p 5432:5432 -e POSTGRES_USER=testuser -e POSTGRES_PASSWORD=password! -e POSTGRES_DB=test --name postgres postgres:alpine
  • docker run -d --name jaeger -e COLLECTOR_ZIPKIN_HTTP_PORT=9411 -p 5775:5775/udp -p 6831:6831/udp -p 6832:6832/udp -p 5778:5778 -p 16686:16686 -p 14268:14268 -p 14250:14250 -p 9411:9411 jaegertracing/all-in-one:1.16

.env File

JAEGER_HOST=127.0.0.1
DB_USER=testuser
DB_PASS=password!
DB_HOST=127.0.0.1
DB_PORT=5432
DB_NAME=test
DB_SSLMODE=disable

Example App

package main
import (
"context""encoding/json""fmt""io""io/ioutil""log""net/http""os""time""github.com/jdefrank/otgorm""github.com/go-chi/chi""github.com/jinzhu/gorm"
_ "github.com/jinzhu/gorm/dialects/postgres"
_ "github.com/joho/godotenv/autoload""go.opentelemetry.io/otel/api/global""go.opentelemetry.io/otel/exporter/trace/jaeger"
sdktrace "go.opentelemetry.io/otel/sdk/trace"
)
typeuserstruct {
IDuint`gorm:"primary_key" json:"id"`FirstNamestring`json:"firstName"`LastNamestring`json:"lastName"`CreatedAt time.Time`json:"createdAt"`UpdatedAt time.Time`json:"updatedAt"`
}
funcreadBody(bodyreader io.ReadCloser) (data []byte, errerror) {
body, err:=ioutil.ReadAll(io.LimitReader(bodyreader, 1048576))
iferr!=nil {
returnnil, err
}
iferr:=bodyreader.Close(); err!=nil {
returnnil, err
}
returnbody, nil
}
funchttpTraceWrapper(h http.Handler) http.Handler {
fn:=func(w http.ResponseWriter, r*http.Request) {
t:=global.TraceProvider().Tracer("component-http")
ctx, span:=t.Start(r.Context(), r.URL.Path)
r=r.WithContext(ctx)
h.ServeHTTP(w, r)
span.End()
}
returnhttp.HandlerFunc(fn)
}
// NOTE: I've found that if you'd like to separate services in the Jaeger UI,// you'll need to create multiple exporters which in turn will show you different colors// per service.funcinitTracer() func() {
//Create Jaeger exporterexporter, err:=jaeger.NewExporter(
jaeger.WithCollectorEndpoint(fmt.Sprintf("http://%s:14268/api/traces", os.Getenv("JAEGER_HOST"))),
jaeger.WithProcess(jaeger.Process{
ServiceName: "go-otel-gorm",
}),
)
iferr!=nil {
log.Fatal(err)
}
// For demoing purposes, always sample. In a production application, you should// configure this to a trace.ProbabilitySampler set at the desired// probability.tp, err:=sdktrace.NewProvider(
sdktrace.WithConfig(sdktrace.Config{DefaultSampler: sdktrace.AlwaysSample()}),
sdktrace.WithSyncer(exporter))
iferr!=nil {
log.Fatal(err)
}
global.SetTraceProvider(tp)
returnfunc() {
exporter.Flush()
}
}
funcmain() {
//Setup the exporter and defer close until main exitsfn:=initTracer()
deferfn()
// Connect to databaseconnString:=fmt.Sprintf("host=%s port=%s user=%s dbname=%s password=%s sslmode=%s",
os.Getenv("DB_HOST"),
os.Getenv("DB_PORT"),
os.Getenv("DB_USER"),
os.Getenv("DB_NAME"),
os.Getenv("DB_PASS"),
os.Getenv("DB_SSLMODE"),
)
db, err:=gorm.Open("postgres", connString)
iferr!=nil {
panic(err)
}
//Register callbacks for GORM, while also passing in config Optsotgorm.RegisterCallbacks(db,
otgorm.WithTracer(global.TraceProvider().Tracer("component-gorm")),
otgorm.Query(true),
otgorm.AllowRoot(true),
)
//Run migration and create a recorddb.AutoMigrate(user{})
newUser:=user{
FirstName: "John",
LastName: "Smith",
}
//Since this first DB call is outside of a parent,//lets set up empty context and the DB client with that contextctx:=context.Background()
orm:=otgorm.WithContext(ctx, db)
err=orm.Create(&newUser).Erroriferr!=nil {
log.Print(err)
}
//Create routerr:=chi.NewRouter()
//Register Endpoints for the APIr.Post("/user", func(w http.ResponseWriter, r*http.Request) {
orm:=otgorm.WithContext(r.Context(), db)
varuuserbody, err:=readBody(r.Body)
iferr!=nil {
log.Print(err)
return
}
err=json.Unmarshal(body, &u)
iferr!=nil {
log.Print(err)
return
}
err=orm.Create(&u).Erroriferr!=nil {
w.WriteHeader(http.StatusInternalServerError)
json.NewEncoder(w).Encode("{\"Error\":\""+err.Error() +"\"")
return
}
w.WriteHeader(http.StatusOK)
return
})
http.ListenAndServe(":3000", httpTraceWrapper(r))
}

License

The MIT License (MIT). Please see License File for more information.

About

Golang Module for OpenTelemetry in GORM

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
GitHub - hyperon-team/otgorm: Golang Module for OpenTelemetry in GORM · GitHub
Skip to content

Repository files navigation

OpenTelemetry Package for the Gorm ORM

This package is meant to simplify wrapping Gorm requests to databases with OpenTelemetry Tracing Spans. The functionality within the package is as of OpenTelemetry-go v0.2.1 and is subject to change fairly rapidly as the standard is evolved.

This package is B.Y.O.E. (Bring Your Own Exporter)

Metrics support coming soon!

Example Usage

Make sure you have the following:

  • Docker
  • Go 1.13
  • cURL or Postman for testing

Run the following commands to create the testing environment:

  • docker run -d -p 5432:5432 -e POSTGRES_USER=testuser -e POSTGRES_PASSWORD=password! -e POSTGRES_DB=test --name postgres postgres:alpine
  • docker run -d --name jaeger -e COLLECTOR_ZIPKIN_HTTP_PORT=9411 -p 5775:5775/udp -p 6831:6831/udp -p 6832:6832/udp -p 5778:5778 -p 16686:16686 -p 14268:14268 -p 14250:14250 -p 9411:9411 jaegertracing/all-in-one:1.16

.env File

JAEGER_HOST=127.0.0.1
DB_USER=testuser
DB_PASS=password!
DB_HOST=127.0.0.1
DB_PORT=5432
DB_NAME=test
DB_SSLMODE=disable

Example App

package main
import (
"context""encoding/json""fmt""io""io/ioutil""log""net/http""os""time""github.com/jdefrank/otgorm""github.com/go-chi/chi""github.com/jinzhu/gorm"
_ "github.com/jinzhu/gorm/dialects/postgres"
_ "github.com/joho/godotenv/autoload""go.opentelemetry.io/otel/api/global""go.opentelemetry.io/otel/exporter/trace/jaeger"
sdktrace "go.opentelemetry.io/otel/sdk/trace"
)
typeuserstruct {
IDuint`gorm:"primary_key" json:"id"`FirstNamestring`json:"firstName"`LastNamestring`json:"lastName"`CreatedAt time.Time`json:"createdAt"`UpdatedAt time.Time`json:"updatedAt"`
}
funcreadBody(bodyreader io.ReadCloser) (data []byte, errerror) {
body, err:=ioutil.ReadAll(io.LimitReader(bodyreader, 1048576))
iferr!=nil {
returnnil, err
}
iferr:=bodyreader.Close(); err!=nil {
returnnil, err
}
returnbody, nil
}
funchttpTraceWrapper(h http.Handler) http.Handler {
fn:=func(w http.ResponseWriter, r*http.Request) {
t:=global.TraceProvider().Tracer("component-http")
ctx, span:=t.Start(r.Context(), r.URL.Path)
r=r.WithContext(ctx)
h.ServeHTTP(w, r)
span.End()
}
returnhttp.HandlerFunc(fn)
}
// NOTE: I've found that if you'd like to separate services in the Jaeger UI,// you'll need to create multiple exporters which in turn will show you different colors// per service.funcinitTracer() func() {
//Create Jaeger exporterexporter, err:=jaeger.NewExporter(
jaeger.WithCollectorEndpoint(fmt.Sprintf("http://%s:14268/api/traces", os.Getenv("JAEGER_HOST"))),
jaeger.WithProcess(jaeger.Process{
ServiceName: "go-otel-gorm",
}),
)
iferr!=nil {
log.Fatal(err)
}
// For demoing purposes, always sample. In a production application, you should// configure this to a trace.ProbabilitySampler set at the desired// probability.tp, err:=sdktrace.NewProvider(
sdktrace.WithConfig(sdktrace.Config{DefaultSampler: sdktrace.AlwaysSample()}),
sdktrace.WithSyncer(exporter))
iferr!=nil {
log.Fatal(err)
}
global.SetTraceProvider(tp)
returnfunc() {
exporter.Flush()
}
}
funcmain() {
//Setup the exporter and defer close until main exitsfn:=initTracer()
deferfn()
// Connect to databaseconnString:=fmt.Sprintf("host=%s port=%s user=%s dbname=%s password=%s sslmode=%s",
os.Getenv("DB_HOST"),
os.Getenv("DB_PORT"),
os.Getenv("DB_USER"),
os.Getenv("DB_NAME"),
os.Getenv("DB_PASS"),
os.Getenv("DB_SSLMODE"),
)
db, err:=gorm.Open("postgres", connString)
iferr!=nil {
panic(err)
}
//Register callbacks for GORM, while also passing in config Optsotgorm.RegisterCallbacks(db,
otgorm.WithTracer(global.TraceProvider().Tracer("component-gorm")),
otgorm.Query(true),
otgorm.AllowRoot(true),
)
//Run migration and create a recorddb.AutoMigrate(user{})
newUser:=user{
FirstName: "John",
LastName: "Smith",
}
//Since this first DB call is outside of a parent,//lets set up empty context and the DB client with that contextctx:=context.Background()
orm:=otgorm.WithContext(ctx, db)
err=orm.Create(&newUser).Erroriferr!=nil {
log.Print(err)
}
//Create routerr:=chi.NewRouter()
//Register Endpoints for the APIr.Post("/user", func(w http.ResponseWriter, r*http.Request) {
orm:=otgorm.WithContext(r.Context(), db)
varuuserbody, err:=readBody(r.Body)
iferr!=nil {
log.Print(err)
return
}
err=json.Unmarshal(body, &u)
iferr!=nil {
log.Print(err)
return
}
err=orm.Create(&u).Erroriferr!=nil {
w.WriteHeader(http.StatusInternalServerError)
json.NewEncoder(w).Encode("{\"Error\":\""+err.Error() +"\"")
return
}
w.WriteHeader(http.StatusOK)
return
})
http.ListenAndServe(":3000", httpTraceWrapper(r))
}

License

The MIT License (MIT). Please see License File for more information.

About

Golang Module for OpenTelemetry in GORM

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - hyperon-team/otgorm: Golang Module for OpenTelemetry in GORM · GitHub
Skip to content

Repository files navigation

OpenTelemetry Package for the Gorm ORM

This package is meant to simplify wrapping Gorm requests to databases with OpenTelemetry Tracing Spans. The functionality within the package is as of OpenTelemetry-go v0.2.1 and is subject to change fairly rapidly as the standard is evolved.

This package is B.Y.O.E. (Bring Your Own Exporter)

Metrics support coming soon!

Example Usage

Make sure you have the following:

  • Docker
  • Go 1.13
  • cURL or Postman for testing

Run the following commands to create the testing environment:

  • docker run -d -p 5432:5432 -e POSTGRES_USER=testuser -e POSTGRES_PASSWORD=password! -e POSTGRES_DB=test --name postgres postgres:alpine
  • docker run -d --name jaeger -e COLLECTOR_ZIPKIN_HTTP_PORT=9411 -p 5775:5775/udp -p 6831:6831/udp -p 6832:6832/udp -p 5778:5778 -p 16686:16686 -p 14268:14268 -p 14250:14250 -p 9411:9411 jaegertracing/all-in-one:1.16

.env File

JAEGER_HOST=127.0.0.1
DB_USER=testuser
DB_PASS=password!
DB_HOST=127.0.0.1
DB_PORT=5432
DB_NAME=test
DB_SSLMODE=disable

Example App

package main
import (
"context""encoding/json""fmt""io""io/ioutil""log""net/http""os""time""github.com/jdefrank/otgorm""github.com/go-chi/chi""github.com/jinzhu/gorm"
_ "github.com/jinzhu/gorm/dialects/postgres"
_ "github.com/joho/godotenv/autoload""go.opentelemetry.io/otel/api/global""go.opentelemetry.io/otel/exporter/trace/jaeger"
sdktrace "go.opentelemetry.io/otel/sdk/trace"
)
typeuserstruct {
IDuint`gorm:"primary_key" json:"id"`FirstNamestring`json:"firstName"`LastNamestring`json:"lastName"`CreatedAt time.Time`json:"createdAt"`UpdatedAt time.Time`json:"updatedAt"`
}
funcreadBody(bodyreader io.ReadCloser) (data []byte, errerror) {
body, err:=ioutil.ReadAll(io.LimitReader(bodyreader, 1048576))
iferr!=nil {
returnnil, err
}
iferr:=bodyreader.Close(); err!=nil {
returnnil, err
}
returnbody, nil
}
funchttpTraceWrapper(h http.Handler) http.Handler {
fn:=func(w http.ResponseWriter, r*http.Request) {
t:=global.TraceProvider().Tracer("component-http")
ctx, span:=t.Start(r.Context(), r.URL.Path)
r=r.WithContext(ctx)
h.ServeHTTP(w, r)
span.End()
}
returnhttp.HandlerFunc(fn)
}
// NOTE: I've found that if you'd like to separate services in the Jaeger UI,// you'll need to create multiple exporters which in turn will show you different colors// per service.funcinitTracer() func() {
//Create Jaeger exporterexporter, err:=jaeger.NewExporter(
jaeger.WithCollectorEndpoint(fmt.Sprintf("http://%s:14268/api/traces", os.Getenv("JAEGER_HOST"))),
jaeger.WithProcess(jaeger.Process{
ServiceName: "go-otel-gorm",
}),
)
iferr!=nil {
log.Fatal(err)
}
// For demoing purposes, always sample. In a production application, you should// configure this to a trace.ProbabilitySampler set at the desired// probability.tp, err:=sdktrace.NewProvider(
sdktrace.WithConfig(sdktrace.Config{DefaultSampler: sdktrace.AlwaysSample()}),
sdktrace.WithSyncer(exporter))
iferr!=nil {
log.Fatal(err)
}
global.SetTraceProvider(tp)
returnfunc() {
exporter.Flush()
}
}
funcmain() {
//Setup the exporter and defer close until main exitsfn:=initTracer()
deferfn()
// Connect to databaseconnString:=fmt.Sprintf("host=%s port=%s user=%s dbname=%s password=%s sslmode=%s",
os.Getenv("DB_HOST"),
os.Getenv("DB_PORT"),
os.Getenv("DB_USER"),
os.Getenv("DB_NAME"),
os.Getenv("DB_PASS"),
os.Getenv("DB_SSLMODE"),
)
db, err:=gorm.Open("postgres", connString)
iferr!=nil {
panic(err)
}
//Register callbacks for GORM, while also passing in config Optsotgorm.RegisterCallbacks(db,
otgorm.WithTracer(global.TraceProvider().Tracer("component-gorm")),
otgorm.Query(true),
otgorm.AllowRoot(true),
)
//Run migration and create a recorddb.AutoMigrate(user{})
newUser:=user{
FirstName: "John",
LastName: "Smith",
}
//Since this first DB call is outside of a parent,//lets set up empty context and the DB client with that contextctx:=context.Background()
orm:=otgorm.WithContext(ctx, db)
err=orm.Create(&newUser).Erroriferr!=nil {
log.Print(err)
}
//Create routerr:=chi.NewRouter()
//Register Endpoints for the APIr.Post("/user", func(w http.ResponseWriter, r*http.Request) {
orm:=otgorm.WithContext(r.Context(), db)
varuuserbody, err:=readBody(r.Body)
iferr!=nil {
log.Print(err)
return
}
err=json.Unmarshal(body, &u)
iferr!=nil {
log.Print(err)
return
}
err=orm.Create(&u).Erroriferr!=nil {
w.WriteHeader(http.StatusInternalServerError)
json.NewEncoder(w).Encode("{\"Error\":\""+err.Error() +"\"")
return
}
w.WriteHeader(http.StatusOK)
return
})
http.ListenAndServe(":3000", httpTraceWrapper(r))
}

License

The MIT License (MIT). Please see License File for more information.

About

Golang Module for OpenTelemetry in GORM

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - hyperon-team/otgorm: Golang Module for OpenTelemetry in GORM · GitHub
Skip to content

Repository files navigation

OpenTelemetry Package for the Gorm ORM

This package is meant to simplify wrapping Gorm requests to databases with OpenTelemetry Tracing Spans. The functionality within the package is as of OpenTelemetry-go v0.2.1 and is subject to change fairly rapidly as the standard is evolved.

This package is B.Y.O.E. (Bring Your Own Exporter)

Metrics support coming soon!

Example Usage

Make sure you have the following:

  • Docker
  • Go 1.13
  • cURL or Postman for testing

Run the following commands to create the testing environment:

  • docker run -d -p 5432:5432 -e POSTGRES_USER=testuser -e POSTGRES_PASSWORD=password! -e POSTGRES_DB=test --name postgres postgres:alpine
  • docker run -d --name jaeger -e COLLECTOR_ZIPKIN_HTTP_PORT=9411 -p 5775:5775/udp -p 6831:6831/udp -p 6832:6832/udp -p 5778:5778 -p 16686:16686 -p 14268:14268 -p 14250:14250 -p 9411:9411 jaegertracing/all-in-one:1.16

.env File

JAEGER_HOST=127.0.0.1
DB_USER=testuser
DB_PASS=password!
DB_HOST=127.0.0.1
DB_PORT=5432
DB_NAME=test
DB_SSLMODE=disable

Example App

package main
import (
"context""encoding/json""fmt""io""io/ioutil""log""net/http""os""time""github.com/jdefrank/otgorm""github.com/go-chi/chi""github.com/jinzhu/gorm"
_ "github.com/jinzhu/gorm/dialects/postgres"
_ "github.com/joho/godotenv/autoload""go.opentelemetry.io/otel/api/global""go.opentelemetry.io/otel/exporter/trace/jaeger"
sdktrace "go.opentelemetry.io/otel/sdk/trace"
)
typeuserstruct {
IDuint`gorm:"primary_key" json:"id"`FirstNamestring`json:"firstName"`LastNamestring`json:"lastName"`CreatedAt time.Time`json:"createdAt"`UpdatedAt time.Time`json:"updatedAt"`
}
funcreadBody(bodyreader io.ReadCloser) (data []byte, errerror) {
body, err:=ioutil.ReadAll(io.LimitReader(bodyreader, 1048576))
iferr!=nil {
returnnil, err
}
iferr:=bodyreader.Close(); err!=nil {
returnnil, err
}
returnbody, nil
}
funchttpTraceWrapper(h http.Handler) http.Handler {
fn:=func(w http.ResponseWriter, r*http.Request) {
t:=global.TraceProvider().Tracer("component-http")
ctx, span:=t.Start(r.Context(), r.URL.Path)
r=r.WithContext(ctx)
h.ServeHTTP(w, r)
span.End()
}
returnhttp.HandlerFunc(fn)
}
// NOTE: I've found that if you'd like to separate services in the Jaeger UI,// you'll need to create multiple exporters which in turn will show you different colors// per service.funcinitTracer() func() {
//Create Jaeger exporterexporter, err:=jaeger.NewExporter(
jaeger.WithCollectorEndpoint(fmt.Sprintf("http://%s:14268/api/traces", os.Getenv("JAEGER_HOST"))),
jaeger.WithProcess(jaeger.Process{
ServiceName: "go-otel-gorm",
}),
)
iferr!=nil {
log.Fatal(err)
}
// For demoing purposes, always sample. In a production application, you should// configure this to a trace.ProbabilitySampler set at the desired// probability.tp, err:=sdktrace.NewProvider(
sdktrace.WithConfig(sdktrace.Config{DefaultSampler: sdktrace.AlwaysSample()}),
sdktrace.WithSyncer(exporter))
iferr!=nil {
log.Fatal(err)
}
global.SetTraceProvider(tp)
returnfunc() {
exporter.Flush()
}
}
funcmain() {
//Setup the exporter and defer close until main exitsfn:=initTracer()
deferfn()
// Connect to databaseconnString:=fmt.Sprintf("host=%s port=%s user=%s dbname=%s password=%s sslmode=%s",
os.Getenv("DB_HOST"),
os.Getenv("DB_PORT"),
os.Getenv("DB_USER"),
os.Getenv("DB_NAME"),
os.Getenv("DB_PASS"),
os.Getenv("DB_SSLMODE"),
)
db, err:=gorm.Open("postgres", connString)
iferr!=nil {
panic(err)
}
//Register callbacks for GORM, while also passing in config Optsotgorm.RegisterCallbacks(db,
otgorm.WithTracer(global.TraceProvider().Tracer("component-gorm")),
otgorm.Query(true),
otgorm.AllowRoot(true),
)
//Run migration and create a recorddb.AutoMigrate(user{})
newUser:=user{
FirstName: "John",
LastName: "Smith",
}
//Since this first DB call is outside of a parent,//lets set up empty context and the DB client with that contextctx:=context.Background()
orm:=otgorm.WithContext(ctx, db)
err=orm.Create(&newUser).Erroriferr!=nil {
log.Print(err)
}
//Create routerr:=chi.NewRouter()
//Register Endpoints for the APIr.Post("/user", func(w http.ResponseWriter, r*http.Request) {
orm:=otgorm.WithContext(r.Context(), db)
varuuserbody, err:=readBody(r.Body)
iferr!=nil {
log.Print(err)
return
}
err=json.Unmarshal(body, &u)
iferr!=nil {
log.Print(err)
return
}
err=orm.Create(&u).Erroriferr!=nil {
w.WriteHeader(http.StatusInternalServerError)
json.NewEncoder(w).Encode("{\"Error\":\""+err.Error() +"\"")
return
}
w.WriteHeader(http.StatusOK)
return
})
http.ListenAndServe(":3000", httpTraceWrapper(r))
}

License

The MIT License (MIT). Please see License File for more information.

About

Golang Module for OpenTelemetry in GORM

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ' GitHub - hyperon-team/otgorm: Golang Module for OpenTelemetry in GORM · GitHub
Skip to content

Repository files navigation

OpenTelemetry Package for the Gorm ORM

This package is meant to simplify wrapping Gorm requests to databases with OpenTelemetry Tracing Spans. The functionality within the package is as of OpenTelemetry-go v0.2.1 and is subject to change fairly rapidly as the standard is evolved.

This package is B.Y.O.E. (Bring Your Own Exporter)

Metrics support coming soon!

Example Usage

Make sure you have the following:

  • Docker
  • Go 1.13
  • cURL or Postman for testing

Run the following commands to create the testing environment:

  • docker run -d -p 5432:5432 -e POSTGRES_USER=testuser -e POSTGRES_PASSWORD=password! -e POSTGRES_DB=test --name postgres postgres:alpine
  • docker run -d --name jaeger -e COLLECTOR_ZIPKIN_HTTP_PORT=9411 -p 5775:5775/udp -p 6831:6831/udp -p 6832:6832/udp -p 5778:5778 -p 16686:16686 -p 14268:14268 -p 14250:14250 -p 9411:9411 jaegertracing/all-in-one:1.16

.env File

JAEGER_HOST=127.0.0.1
DB_USER=testuser
DB_PASS=password!
DB_HOST=127.0.0.1
DB_PORT=5432
DB_NAME=test
DB_SSLMODE=disable

Example App

package main
import (
"context""encoding/json""fmt""io""io/ioutil""log""net/http""os""time""github.com/jdefrank/otgorm""github.com/go-chi/chi""github.com/jinzhu/gorm"
_ "github.com/jinzhu/gorm/dialects/postgres"
_ "github.com/joho/godotenv/autoload""go.opentelemetry.io/otel/api/global""go.opentelemetry.io/otel/exporter/trace/jaeger"
sdktrace "go.opentelemetry.io/otel/sdk/trace"
)
typeuserstruct {
IDuint`gorm:"primary_key" json:"id"`FirstNamestring`json:"firstName"`LastNamestring`json:"lastName"`CreatedAt time.Time`json:"createdAt"`UpdatedAt time.Time`json:"updatedAt"`
}
funcreadBody(bodyreader io.ReadCloser) (data []byte, errerror) {
body, err:=ioutil.ReadAll(io.LimitReader(bodyreader, 1048576))
iferr!=nil {
returnnil, err
}
iferr:=bodyreader.Close(); err!=nil {
returnnil, err
}
returnbody, nil
}
funchttpTraceWrapper(h http.Handler) http.Handler {
fn:=func(w http.ResponseWriter, r*http.Request) {
t:=global.TraceProvider().Tracer("component-http")
ctx, span:=t.Start(r.Context(), r.URL.Path)
r=r.WithContext(ctx)
h.ServeHTTP(w, r)
span.End()
}
returnhttp.HandlerFunc(fn)
}
// NOTE: I've found that if you'd like to separate services in the Jaeger UI,// you'll need to create multiple exporters which in turn will show you different colors// per service.funcinitTracer() func() {
//Create Jaeger exporterexporter, err:=jaeger.NewExporter(
jaeger.WithCollectorEndpoint(fmt.Sprintf("http://%s:14268/api/traces", os.Getenv("JAEGER_HOST"))),
jaeger.WithProcess(jaeger.Process{
ServiceName: "go-otel-gorm",
}),
)
iferr!=nil {
log.Fatal(err)
}
// For demoing purposes, always sample. In a production application, you should// configure this to a trace.ProbabilitySampler set at the desired// probability.tp, err:=sdktrace.NewProvider(
sdktrace.WithConfig(sdktrace.Config{DefaultSampler: sdktrace.AlwaysSample()}),
sdktrace.WithSyncer(exporter))
iferr!=nil {
log.Fatal(err)
}
global.SetTraceProvider(tp)
returnfunc() {
exporter.Flush()
}
}
funcmain() {
//Setup the exporter and defer close until main exitsfn:=initTracer()
deferfn()
// Connect to databaseconnString:=fmt.Sprintf("host=%s port=%s user=%s dbname=%s password=%s sslmode=%s",
os.Getenv("DB_HOST"),
os.Getenv("DB_PORT"),
os.Getenv("DB_USER"),
os.Getenv("DB_NAME"),
os.Getenv("DB_PASS"),
os.Getenv("DB_SSLMODE"),
)
db, err:=gorm.Open("postgres", connString)
iferr!=nil {
panic(err)
}
//Register callbacks for GORM, while also passing in config Optsotgorm.RegisterCallbacks(db,
otgorm.WithTracer(global.TraceProvider().Tracer("component-gorm")),
otgorm.Query(true),
otgorm.AllowRoot(true),
)
//Run migration and create a recorddb.AutoMigrate(user{})
newUser:=user{
FirstName: "John",
LastName: "Smith",
}
//Since this first DB call is outside of a parent,//lets set up empty context and the DB client with that contextctx:=context.Background()
orm:=otgorm.WithContext(ctx, db)
err=orm.Create(&newUser).Erroriferr!=nil {
log.Print(err)
}
//Create routerr:=chi.NewRouter()
//Register Endpoints for the APIr.Post("/user", func(w http.ResponseWriter, r*http.Request) {
orm:=otgorm.WithContext(r.Context(), db)
varuuserbody, err:=readBody(r.Body)
iferr!=nil {
log.Print(err)
return
}
err=json.Unmarshal(body, &u)
iferr!=nil {
log.Print(err)
return
}
err=orm.Create(&u).Erroriferr!=nil {
w.WriteHeader(http.StatusInternalServerError)
json.NewEncoder(w).Encode("{\"Error\":\""+err.Error() +"\"")
return
}
w.WriteHeader(http.StatusOK)
return
})
http.ListenAndServe(":3000", httpTraceWrapper(r))
}

License

The MIT License (MIT). Please see License File for more information.

About

Golang Module for OpenTelemetry in GORM

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - hyperon-team/otgorm: Golang Module for OpenTelemetry in GORM · GitHub
Skip to content

Repository files navigation

OpenTelemetry Package for the Gorm ORM

This package is meant to simplify wrapping Gorm requests to databases with OpenTelemetry Tracing Spans. The functionality within the package is as of OpenTelemetry-go v0.2.1 and is subject to change fairly rapidly as the standard is evolved.

This package is B.Y.O.E. (Bring Your Own Exporter)

Metrics support coming soon!

Example Usage

Make sure you have the following:

  • Docker
  • Go 1.13
  • cURL or Postman for testing

Run the following commands to create the testing environment:

  • docker run -d -p 5432:5432 -e POSTGRES_USER=testuser -e POSTGRES_PASSWORD=password! -e POSTGRES_DB=test --name postgres postgres:alpine
  • docker run -d --name jaeger -e COLLECTOR_ZIPKIN_HTTP_PORT=9411 -p 5775:5775/udp -p 6831:6831/udp -p 6832:6832/udp -p 5778:5778 -p 16686:16686 -p 14268:14268 -p 14250:14250 -p 9411:9411 jaegertracing/all-in-one:1.16

.env File

JAEGER_HOST=127.0.0.1
DB_USER=testuser
DB_PASS=password!
DB_HOST=127.0.0.1
DB_PORT=5432
DB_NAME=test
DB_SSLMODE=disable

Example App

package main
import (
"context""encoding/json""fmt""io""io/ioutil""log""net/http""os""time""github.com/jdefrank/otgorm""github.com/go-chi/chi""github.com/jinzhu/gorm"
_ "github.com/jinzhu/gorm/dialects/postgres"
_ "github.com/joho/godotenv/autoload""go.opentelemetry.io/otel/api/global""go.opentelemetry.io/otel/exporter/trace/jaeger"
sdktrace "go.opentelemetry.io/otel/sdk/trace"
)
typeuserstruct {
IDuint`gorm:"primary_key" json:"id"`FirstNamestring`json:"firstName"`LastNamestring`json:"lastName"`CreatedAt time.Time`json:"createdAt"`UpdatedAt time.Time`json:"updatedAt"`
}
funcreadBody(bodyreader io.ReadCloser) (data []byte, errerror) {
body, err:=ioutil.ReadAll(io.LimitReader(bodyreader, 1048576))
iferr!=nil {
returnnil, err
}
iferr:=bodyreader.Close(); err!=nil {
returnnil, err
}
returnbody, nil
}
funchttpTraceWrapper(h http.Handler) http.Handler {
fn:=func(w http.ResponseWriter, r*http.Request) {
t:=global.TraceProvider().Tracer("component-http")
ctx, span:=t.Start(r.Context(), r.URL.Path)
r=r.WithContext(ctx)
h.ServeHTTP(w, r)
span.End()
}
returnhttp.HandlerFunc(fn)
}
// NOTE: I've found that if you'd like to separate services in the Jaeger UI,// you'll need to create multiple exporters which in turn will show you different colors// per service.funcinitTracer() func() {
//Create Jaeger exporterexporter, err:=jaeger.NewExporter(
jaeger.WithCollectorEndpoint(fmt.Sprintf("http://%s:14268/api/traces", os.Getenv("JAEGER_HOST"))),
jaeger.WithProcess(jaeger.Process{
ServiceName: "go-otel-gorm",
}),
)
iferr!=nil {
log.Fatal(err)
}
// For demoing purposes, always sample. In a production application, you should// configure this to a trace.ProbabilitySampler set at the desired// probability.tp, err:=sdktrace.NewProvider(
sdktrace.WithConfig(sdktrace.Config{DefaultSampler: sdktrace.AlwaysSample()}),
sdktrace.WithSyncer(exporter))
iferr!=nil {
log.Fatal(err)
}
global.SetTraceProvider(tp)
returnfunc() {
exporter.Flush()
}
}
funcmain() {
//Setup the exporter and defer close until main exitsfn:=initTracer()
deferfn()
// Connect to databaseconnString:=fmt.Sprintf("host=%s port=%s user=%s dbname=%s password=%s sslmode=%s",
os.Getenv("DB_HOST"),
os.Getenv("DB_PORT"),
os.Getenv("DB_USER"),
os.Getenv("DB_NAME"),
os.Getenv("DB_PASS"),
os.Getenv("DB_SSLMODE"),
)
db, err:=gorm.Open("postgres", connString)
iferr!=nil {
panic(err)
}
//Register callbacks for GORM, while also passing in config Optsotgorm.RegisterCallbacks(db,
otgorm.WithTracer(global.TraceProvider().Tracer("component-gorm")),
otgorm.Query(true),
otgorm.AllowRoot(true),
)
//Run migration and create a recorddb.AutoMigrate(user{})
newUser:=user{
FirstName: "John",
LastName: "Smith",
}
//Since this first DB call is outside of a parent,//lets set up empty context and the DB client with that contextctx:=context.Background()
orm:=otgorm.WithContext(ctx, db)
err=orm.Create(&newUser).Erroriferr!=nil {
log.Print(err)
}
//Create routerr:=chi.NewRouter()
//Register Endpoints for the APIr.Post("/user", func(w http.ResponseWriter, r*http.Request) {
orm:=otgorm.WithContext(r.Context(), db)
varuuserbody, err:=readBody(r.Body)
iferr!=nil {
log.Print(err)
return
}
err=json.Unmarshal(body, &u)
iferr!=nil {
log.Print(err)
return
}
err=orm.Create(&u).Erroriferr!=nil {
w.WriteHeader(http.StatusInternalServerError)
json.NewEncoder(w).Encode("{\"Error\":\""+err.Error() +"\"")
return
}
w.WriteHeader(http.StatusOK)
return
})
http.ListenAndServe(":3000", httpTraceWrapper(r))
}

License

The MIT License (MIT). Please see License File for more information.

About

Golang Module for OpenTelemetry in GORM

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); })(); GitHub - hyperon-team/otgorm: Golang Module for OpenTelemetry in GORM · GitHub
Skip to content

Repository files navigation

OpenTelemetry Package for the Gorm ORM

This package is meant to simplify wrapping Gorm requests to databases with OpenTelemetry Tracing Spans. The functionality within the package is as of OpenTelemetry-go v0.2.1 and is subject to change fairly rapidly as the standard is evolved.

This package is B.Y.O.E. (Bring Your Own Exporter)

Metrics support coming soon!

Example Usage

Make sure you have the following:

  • Docker
  • Go 1.13
  • cURL or Postman for testing

Run the following commands to create the testing environment:

  • docker run -d -p 5432:5432 -e POSTGRES_USER=testuser -e POSTGRES_PASSWORD=password! -e POSTGRES_DB=test --name postgres postgres:alpine
  • docker run -d --name jaeger -e COLLECTOR_ZIPKIN_HTTP_PORT=9411 -p 5775:5775/udp -p 6831:6831/udp -p 6832:6832/udp -p 5778:5778 -p 16686:16686 -p 14268:14268 -p 14250:14250 -p 9411:9411 jaegertracing/all-in-one:1.16

.env File

JAEGER_HOST=127.0.0.1
DB_USER=testuser
DB_PASS=password!
DB_HOST=127.0.0.1
DB_PORT=5432
DB_NAME=test
DB_SSLMODE=disable

Example App

package main
import (
"context""encoding/json""fmt""io""io/ioutil""log""net/http""os""time""github.com/jdefrank/otgorm""github.com/go-chi/chi""github.com/jinzhu/gorm"
_ "github.com/jinzhu/gorm/dialects/postgres"
_ "github.com/joho/godotenv/autoload""go.opentelemetry.io/otel/api/global""go.opentelemetry.io/otel/exporter/trace/jaeger"
sdktrace "go.opentelemetry.io/otel/sdk/trace"
)
typeuserstruct {
IDuint`gorm:"primary_key" json:"id"`FirstNamestring`json:"firstName"`LastNamestring`json:"lastName"`CreatedAt time.Time`json:"createdAt"`UpdatedAt time.Time`json:"updatedAt"`
}
funcreadBody(bodyreader io.ReadCloser) (data []byte, errerror) {
body, err:=ioutil.ReadAll(io.LimitReader(bodyreader, 1048576))
iferr!=nil {
returnnil, err
}
iferr:=bodyreader.Close(); err!=nil {
returnnil, err
}
returnbody, nil
}
funchttpTraceWrapper(h http.Handler) http.Handler {
fn:=func(w http.ResponseWriter, r*http.Request) {
t:=global.TraceProvider().Tracer("component-http")
ctx, span:=t.Start(r.Context(), r.URL.Path)
r=r.WithContext(ctx)
h.ServeHTTP(w, r)
span.End()
}
returnhttp.HandlerFunc(fn)
}
// NOTE: I've found that if you'd like to separate services in the Jaeger UI,// you'll need to create multiple exporters which in turn will show you different colors// per service.funcinitTracer() func() {
//Create Jaeger exporterexporter, err:=jaeger.NewExporter(
jaeger.WithCollectorEndpoint(fmt.Sprintf("http://%s:14268/api/traces", os.Getenv("JAEGER_HOST"))),
jaeger.WithProcess(jaeger.Process{
ServiceName: "go-otel-gorm",
}),
)
iferr!=nil {
log.Fatal(err)
}
// For demoing purposes, always sample. In a production application, you should// configure this to a trace.ProbabilitySampler set at the desired// probability.tp, err:=sdktrace.NewProvider(
sdktrace.WithConfig(sdktrace.Config{DefaultSampler: sdktrace.AlwaysSample()}),
sdktrace.WithSyncer(exporter))
iferr!=nil {
log.Fatal(err)
}
global.SetTraceProvider(tp)
returnfunc() {
exporter.Flush()
}
}
funcmain() {
//Setup the exporter and defer close until main exitsfn:=initTracer()
deferfn()
// Connect to databaseconnString:=fmt.Sprintf("host=%s port=%s user=%s dbname=%s password=%s sslmode=%s",
os.Getenv("DB_HOST"),
os.Getenv("DB_PORT"),
os.Getenv("DB_USER"),
os.Getenv("DB_NAME"),
os.Getenv("DB_PASS"),
os.Getenv("DB_SSLMODE"),
)
db, err:=gorm.Open("postgres", connString)
iferr!=nil {
panic(err)
}
//Register callbacks for GORM, while also passing in config Optsotgorm.RegisterCallbacks(db,
otgorm.WithTracer(global.TraceProvider().Tracer("component-gorm")),
otgorm.Query(true),
otgorm.AllowRoot(true),
)
//Run migration and create a recorddb.AutoMigrate(user{})
newUser:=user{
FirstName: "John",
LastName: "Smith",
}
//Since this first DB call is outside of a parent,//lets set up empty context and the DB client with that contextctx:=context.Background()
orm:=otgorm.WithContext(ctx, db)
err=orm.Create(&newUser).Erroriferr!=nil {
log.Print(err)
}
//Create routerr:=chi.NewRouter()
//Register Endpoints for the APIr.Post("/user", func(w http.ResponseWriter, r*http.Request) {
orm:=otgorm.WithContext(r.Context(), db)
varuuserbody, err:=readBody(r.Body)
iferr!=nil {
log.Print(err)
return
}
err=json.Unmarshal(body, &u)
iferr!=nil {
log.Print(err)
return
}
err=orm.Create(&u).Erroriferr!=nil {
w.WriteHeader(http.StatusInternalServerError)
json.NewEncoder(w).Encode("{\"Error\":\""+err.Error() +"\"")
return
}
w.WriteHeader(http.StatusOK)
return
})
http.ListenAndServe(":3000", httpTraceWrapper(r))
}

License

The MIT License (MIT). Please see License File for more information.

About

Golang Module for OpenTelemetry in GORM

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages