{"id":18266828,"url":"https://github.com/chenquan/sqltrace","last_synced_at":"2025-04-04T22:30:31.597Z","repository":{"id":59229659,"uuid":"535177776","full_name":"chenquan/sqltrace","owner":"chenquan","description":"A low-code intrusion library that provides SQL tracing capabilities, suitable for any relational database (Sqlite3, MySQL, Oracle, SQL Server, PostgreSQL, TiDB, TDengine, etc.) and ORM libraries for various relational database (gorm, xorm, sqlx, ent,  etc.)","archived":false,"fork":false,"pushed_at":"2024-02-26T13:06:13.000Z","size":335,"stargazers_count":16,"open_issues_count":2,"forks_count":2,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-03-20T20:13:59.936Z","etag":null,"topics":["ent","go","golang","gorm","mysql","opentelemetry","oracle","postgresql","sql","sqlite3","sqlserver","sqlx","tidb","trace","xorm"],"latest_commit_sha":null,"homepage":"","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/chenquan.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2022-09-11T03:12:43.000Z","updated_at":"2024-12-20T20:39:35.000Z","dependencies_parsed_at":"2024-02-07T15:28:19.968Z","dependency_job_id":"3c03a1b6-208d-4573-9a93-4e3406da78c4","html_url":"https://github.com/chenquan/sqltrace","commit_stats":{"total_commits":43,"total_committers":2,"mean_commits":21.5,"dds":"0.39534883720930236","last_synced_commit":"b6f54b3d24dcf66b4b934b307b409db9ba1cf6f2"},"previous_names":[],"tags_count":6,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/chenquan%2Fsqltrace","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/chenquan%2Fsqltrace/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/chenquan%2Fsqltrace/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/chenquan%2Fsqltrace/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/chenquan","download_url":"https://codeload.github.com/chenquan/sqltrace/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247260217,"owners_count":20909957,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["ent","go","golang","gorm","mysql","opentelemetry","oracle","postgresql","sql","sqlite3","sqlserver","sqlx","tidb","trace","xorm"],"created_at":"2024-11-05T11:25:02.196Z","updated_at":"2025-04-04T22:30:30.752Z","avatar_url":"https://github.com/chenquan.png","language":"Go","readme":"# sqltrace\n\nA low-code intrusion library that provides SQL tracing capabilities, suitable for any relational database (Sqlite3, MySQL, Oracle, SQL Server,\nPostgreSQL, TiDB, TDengine, etc.) and ORM libraries for various relational database (gorm, xorm, sqlx, etc.)\n\n\u003e Unstable, use with caution in production environment\n\n# 😜installation\n\n```shell\ngo get -u github.com/chenquan/sqltrace\n```\n\n# 👏how to use\n\n## native\n\n```go\npackage main\n\nimport (\n\t\"context\"\n\t\"database/sql\"\n\t\"fmt\"\n\n\t\"github.com/chenquan/sqltrace\"\n\t\"github.com/mattn/go-sqlite3\"\n\t_ \"github.com/mattn/go-sqlite3\"\n\t\"go.opentelemetry.io/otel\"\n\t\"go.opentelemetry.io/otel/trace\"\n)\n\nfunc main() {\n\t// Create a sqlite3 driver with link tracking\n\tdriver := sqltrace.NewDriver(sqltrace.Config{\n\t\tName:           \"sqlite3_trace\",\n\t\tDataSourceName: \"sqlite3\",\n\t\tEndpoint:       \"http://localhost:14268/api/traces\",\n\t\tSampler:        1,\n\t\tBatcher:        \"jaeger\",\n\t}, \u0026sqlite3.SQLiteDriver{})\n\tdefer sqltrace.StopAgent()\n\n\t// register new driver\n\tsql.Register(\"sqlite3_trace\", driver)\n\n\t// open database\n\tdb, err := sql.Open(\"sqlite3_trace\", \"identifier.sqlite\")\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\n\ttracer := otel.GetTracerProvider().Tracer(\"sqlite3_trace\")\n\tctx, span := tracer.Start(context.Background(),\n\t\t\"test\",\n\t\ttrace.WithSpanKind(trace.SpanKindClient),\n\t)\n\tdefer span.End()\n\n\tdb.ExecContext(ctx, `CREATE TABLE t\n(\n    age  integer,\n    name TEXT\n)`)\n\tdb.ExecContext(ctx, \"insert into t values (?,?)\", 1, \"chenquan\")\n\n\t// transaction\n\ttx, err := db.BeginTx(ctx, nil)\n\tstmt, err := tx.PrepareContext(ctx, \"select age+1 as age,name from t where age = ?;\")\n\tstmt.QueryContext(ctx, 1)\n\ttx.Commit()\n\n\trows, err := db.QueryContext(ctx, \"select  age+1 as age,name from t;\")\n\tfor rows.Next() {\n\t\tvar age int\n\t\tvar name string\n\t\terr := rows.Scan(\u0026age, \u0026name)\n\t\tif err != nil {\n\t\t\tfmt.Println(err)\n\t\t}\n\n\t\tfmt.Println(age, name)\n\t}\n}\n```\n\n![](images/trace-native.png)\n\n## gorm\n\n```go\npackage main\n\nimport (\n\t\"context\"\n\t\"database/sql\"\n\t\"fmt\"\n\n\t\"github.com/chenquan/sqltrace\"\n\t\"github.com/mattn/go-sqlite3\"\n\t\"go.opentelemetry.io/otel\"\n\t\"go.opentelemetry.io/otel/trace\"\n\t\"gorm.io/driver/sqlite\"\n\t\"gorm.io/gorm\"\n)\n\nfunc main() {\n\t// Create a sqlite3 driver with link tracking\n\tdriver := sqltrace.NewDriver(sqltrace.Config{\n\t\tDataSourceName: \"sqlite3\",\n\t}, \u0026sqlite3.SQLiteDriver{})\n\tdefer sqltrace.StopAgent()\n\n\t// register new driver\n\tsql.Register(\"sqlite3_trace\", driver)\n\n\tdb, err := gorm.Open(sqlite.Dialector{\n\t\tDriverName: \"sqlite3_trace\",\n\t\tDSN:        \"identifier.sqlite\",\n\t}, \u0026gorm.Config{})\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\ttracer := otel.GetTracerProvider().Tracer(\"sqlite3_trace\")\n\tctx, span := tracer.Start(context.Background(),\n\t\t\"test\",\n\t\ttrace.WithSpanKind(trace.SpanKindClient),\n\t)\n\tdefer span.End()\n\n\ttype T struct {\n\t\tAge  int    `db:\"age\"`\n\t\tName string `db:\"name\"`\n\t}\n\tdb = db.WithContext(ctx)\n\tdb.Migrator().AutoMigrate(\u0026T{})\n\tdb.Create(\u0026T{\n\t\tAge:  1,\n\t\tName: \"chenquan\",\n\t})\n\n\trows, err := db.Raw(\"select  age+1 as age,name from ts;\").Rows()\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\n\tfor rows.Next() {\n\t\tvar age int\n\t\tvar name string\n\t\terr := rows.Scan(\u0026age, \u0026name)\n\t\tif err != nil {\n\t\t\tfmt.Println(err)\n\t\t}\n\n\t\tfmt.Println(age, name)\n\t}\n\tdb.Commit()\n}\n\n\n```\n\n![](images/trace-gorm.png)\n\n# ⭐star\n\nIf you like or are using this project to learn or start your solution, please give it a star⭐. Thanks!\n\n# 👐ecosystem\n\n- [sqlbreaker](https://github.com/chenquan/sqlbreaker): A low-code intrusion library that provides SQL breaker capabilities, suitable for any\n  relational database (Sqlite3, MySQL, Oracle, SQL Server, PostgreSQL, TiDB, TDengine, etc.) and ORM libraries for various\n  relational database (gorm, xorm, sqlx, etc.)\n- [sqlplus](https://github.com/chenquan/sqlplus): A sql enhancement tool library based on `database/sql/driver`\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fchenquan%2Fsqltrace","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fchenquan%2Fsqltrace","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fchenquan%2Fsqltrace/lists"}