awaragi / prometheus-mssql-exporter Goto Github PK
View Code? Open in Web Editor NEWDocker container for exporting MSSQL statistics to Prometheus
License: MIT License
Docker container for exporting MSSQL statistics to Prometheus
License: MIT License
Hi,
Great Exporter, as i was exploring to add a new metric i am receiving an error:
If i remove the added metric the error goes off. any advise?
(node:26873) [DEP0064] DeprecationWarning: tls.createSecurePair() is deprecated. Please use tls.Socket instead.
/var/mssql-prometheus/prometheus-mssql-exporter/metrics.js:21
metrics.mssql_instance_name.set(mssql_instance_name);
^
TypeError: Cannot read property 'set' of undefined
at Object.collect (/var/mssql-prometheus/prometheus-mssql-exporter/metrics.js:21:37)
at Request [as userCallback] (/var/mssql-prometheus/prometheus-mssql-exporter/index.js:71:27)
at Request._this.callback (/var/mssql-prometheus/prometheus-mssql-exporter/node_modules/tedious/lib/request.js:47:27)
at Connection.message (/var/mssql-prometheus/prometheus-mssql-exporter/node_modules/tedious/lib/connection.js:1401:27)
at Connection.dispatchEvent (/var/mssql-prometheus/prometheus-mssql-exporter/node_modules/tedious/lib/connection.js:687:45)
at MessageIO. (/var/mssql-prometheus/prometheus-mssql-exporter/node_modules/tedious/lib/connection.js:602:18)
at emitNone (events.js:106:13)
at MessageIO.emit (events.js:208:7)
at ReadablePacketStream. (/var/mssql-prometheus/prometheus-mssql-exporter/node_modules/tedious/lib/message-io.js:102:16)
at emitOne (events.js:116:13)
events.js:208:7)
de: 'ETIMEOUT' }
Error executing SQL query SELECT DB_NAME(sP.dbid)
, COUNT(sP.spid)
FROM sys.sysprocesses sP
GROUP BY DB_NAME(sP.dbid) { RequestError: Timeout: Request failed to complete in 15000ms
at RequestError (/var/mssql-prometheus/prometheus-mssql-exporter/node_modules/tedious/lib/errors.js:34:12)
at Connection.message (/var/mssql-prometheus/prometheus-mssql-exporter/node_modules/tedious/lib/connection.js:1431:40)
Thank you
how to specify the path in docker-compose.yml to a specific database (eg Catalog = tetsbase)?
Would like to understand on how the query interval is scheduled? what is the way to set the custom interval? can I define different query interval with same image(one query in every 10 min and another in once a day)?
I use docker desktop in windows 10, and when I create the container using docker compose the env variable "USERNAME"
doesn't override the system's existing env variable "USERNAME"
and instead of using the value SA uses the username Windows which then gives a connection error. I was able to fix this when I was testing the application locally by changing config.connect.authentication.options.userName
to a hard coded value "SA"
.
My DB connection is slow because of network. So every request is getting dead after 15000ms. Any help with this.
Hello,
I used a docker image to launch the exporter, but all that i got was the logs below :
Failed to connect to database: Failed to connect to XX.XX.XX.XX:1433 - Could not connect (sequence)
The endpoint '/metrics' is reachable although as the connection is down only the metrics "up" is shown.
Here what i already done :
Could you help please ?
i need help
If you have multiple named instances the sql has issues. For example:
https://github.com/awaragi/prometheus-mssql-exporter/blob/master/src/metrics.js#L224
the line:
AND object_name = 'SQLServer:Buffer Manager'
should be similar to:
SELECT * FROM sys.dm_os_performance_counters WHERE object_name LIKE '%Buffer Manager%';
which is how MS recommends to do it:
https://learn.microsoft.com/en-us/sql/relational-databases/performance-monitor/sql-server-buffer-manager-object?view=sql-server-ver16
For example if you have a named instance the string for the object_name could be:
'MSSQL$MYSQLNAME:Buffer Manager'
which won't match currently
I got the exceptions on windows:Failed to connect to database: Failed to connect to 192.168.0.97:1443 - connect ECONNREFUSED 192.168.0.97:1443
I am sure I had change server/port/user/passord correctly.
Anybody can help me ?
use the lastest prometheus-mssql-exporter in docker.can not connect to sqlserver 2008 r2. the dynamic port is closed.i have try more than three machine throw same errors like :Failed to connect to database: Failed to connect to ...:1433 in 15000m; but i also try sqlserver 2016 and sqlserver 2019.they are ok!!
If a database is so big, that its (size * 8) more than 32bit int max value, the following exception is thrown by the MSSQL server: "Arithmetic overflow error converting expression to data type int.".
The query:
SELECT DB_NAME(database_id) AS database_name, Name AS logical_name, type, physical_name, (size * 8) size_kb FROM sys.master_files
at line 124 of the metrics.js file can be modified like this:
SELECT DB_NAME(database_id) AS database_name, Name AS logical_name, type, physical_name, (size * cast(8 as bigint)) size_kb FROM sys.master_files
.
If the bigint value wont do any harm later, this change should save the world... :-)
Hello,
I'm having the following issue with the exporter : when the SQL Server instance is unavailable for a while, after a timeout, the exporter crashes.
Below are the logs:
Jul 6 15:17:08 prometheus-a prometheus-mssql-exporter[1308]: Failed to connect to database: Failed to connect to x.x.x.x:1433 in 15000ms
Jul 6 15:17:23 prometheus-a prometheus-mssql-exporter[1308]: Failed to connect to database: Failed to connect to x.x.x.x:1433 in 15000ms
Jul 6 15:17:39 prometheus-a prometheus-mssql-exporter[1308]: events.js:182
Jul 6 15:17:39 prometheus-a prometheus-mssql-exporter[1308]: throw er; // Unhandled 'error' event
Jul 6 15:17:39 prometheus-a prometheus-mssql-exporter[1308]: ^
Jul 6 15:17:39 prometheus-a prometheus-mssql-exporter[1308]:
Jul 6 15:17:39 prometheus-a prometheus-mssql-exporter[1308]: Error: No event 'socketConnect' in state 'Final'
Jul 6 15:17:39 prometheus-a prometheus-mssql-exporter[1308]: at Connection.dispatchEvent (/usr/src/app/node_modules/tedious/lib/connection.js:689:28)
Jul 6 15:17:39 prometheus-a prometheus-mssql-exporter[1308]: at Connection.socketConnect (/usr/src/app/node_modules/tedious/lib/connection.js:713:19)
Jul 6 15:17:39 prometheus-a prometheus-mssql-exporter[1308]: at /usr/src/app/node_modules/tedious/lib/connection.js:606:16
Jul 6 15:17:39 prometheus-a prometheus-mssql-exporter[1308]: at Socket.onConnect (/usr/src/app/node_modules/tedious/lib/connector.js:55:9)
Jul 6 15:17:39 prometheus-a prometheus-mssql-exporter[1308]: at emitNone (events.js:105:13)
Jul 6 15:17:39 prometheus-a prometheus-mssql-exporter[1308]: at Socket.emit (events.js:207:7)
Jul 6 15:17:39 prometheus-a prometheus-mssql-exporter[1308]: at TCPConnectWrap.afterConnect [as oncomplete] (net.js:1140:10)
Host configuration:
prometheus-a :: ~ » lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 16.04.4 LTS
Release: 16.04
Codename: xenial
prometheus-a :: ~ » docker --version
Docker version 18.03.1-ce, build 9ee9f40
I'm running the container via awaragi/prometheus-mssql-exporter:latest
SQL Server is version 2016.
022-04-25T07:48:56.229Z app Prometheus-MSSQL Exporter listening on local port 4000 monitoring [email protected]:1433
2022-04-25T07:49:00.515Z app Received /metrics request
Failed to connect to database: Failed to connect to testsql.com:1433 - Could not connect (sequence)
2022-04-25T07:49:00.808Z app Error handling /metrics request
/usr/src/app/index.js:132
mssql_up.set(0);
^
ReferenceError: mssql_up is not defined
at /usr/src/app/index.js:132:5
at processTicksAndRejections (node:internal/process/task_queues:96:5)
Running this version which is :latest
at this time of writing.
If the connection is reset when the scrape is happening, the exporter crashes. Example log:
Tue, 06 Jul 2021 15:45:23 GMT app Connecting to database xyz-mssql
events.js:182
throw er; // Unhandled 'error' event
^
ConnectionError: Connection lost - read ECONNRESET
at ConnectionError (/usr/src/app/node_modules/tedious/lib/errors.js:12:12)
at Connection.socketError (/usr/src/app/node_modules/tedious/lib/connection.js:703:28)
at emitOne (events.js:115:13)
at Socket.emit (events.js:210:7)
at emitErrorNT (internal/streams/destroy.js:64:8)
at _combinedTickCallback (internal/process/next_tick.js:138:11)
at process._tickCallback (internal/process/next_tick.js:180:9)
I am running two instances of the container.
Container 1 - working fine, listening to port 4000 and receiving metrics from MS SQL Server1
Container 2 - is not working since it is trying to listen to port 4000 though I have mapped to port 4001 by using the following command to listen to MS SQL Server2
docker run -e SERVER=192.168.56.101 -e USERNAME=SA -e PASSWORD=qkD4x3yy -e DEBUG=app -p 4001:4001 --name prometheus-mssql-exporter awaragi/prometheus-mssql-exporter
Please suggest.
prometheus-mssql-exporter/metrics.js
Lines 29 to 32 in 297e0b7
The sql as above may output the following indicators:
mssql_connections{database="null",state="current"} 1
Could you please help me out to track MS SQL with remote server installed Prometheus.
Hi,
Just use sql profiler or Activity Monitor on SSMS, it seems this project is set the app name "Tedious".
Is there any method to rename it?
Add database for non admin access
Add non_encrypted connection (default to false)
Add skipped metric list (regular expressions to be used in metricName.match)
The exporter seems to lose connection periodically with Azure SQL Managed Instance (happens daily, usually around same time) and the only thing I've seen that gives some indication as to why are errors messages coming from the exporter that are like this one:
Error executing metric mssql_batch_requests SQL query SELECT TOP 1 cntr_value
FROM sys.dm_os_performance_counters
WHERE counter_name = 'Batch Requests/sec' RequestError: Requests can only be made in the LoggedIn state, not the Final state
at Connection.makeRequest (/usr/src/app/node_modules/tedious/lib/connection.js:2238:24)
at Connection.execSql (/usr/src/app/node_modules/tedious/lib/connection.js:1768:10)
at /usr/src/app/index.js:110:16
at new Promise (<anonymous>)
at measure (/usr/src/app/index.js:89:10)
at collect (/usr/src/app/index.js:123:11)
at runMicrotasks (<anonymous>)
at processTicksAndRejections (node:internal/process/task_queues:96:5)
at async /usr/src/app/index.js:137:5 {
code: 'EINVALIDSTATE',
number: undefined,
state: undefined,
class: undefined,
serverName: undefined,
procName: undefined,
lineNumber: undefined
}
Here's a Grafana panel that shows the metrics mssql_connections
and demonstrates how the scraper periodically fails to retrieve data from SQL MI.
Hello,
Useful exporter , i just deployed 2 new MSSQL instances (2012 & 2019) and each exporters fails with :
_/usr/src/app/metrics.js:232
const page_read = row[0].value;
^
TypeError: Cannot read properties of undefined (reading '0')
at Object.collect (/usr/src/app/metrics.js:232:26)
at Request.userCallback (/usr/src/app/index.js:82:19)
at Request.callback (/usr/src/app/node_modules/tedious/lib/request.js:205:14)
at Parser.onEndOfMessage (/usr/src/app/node_modules/tedious/lib/connection.js:2854:22)
at Object.onceWrapper (node:events:645:28)
at Parser.emit (node:events:526:28)
at Readable.<anonymous> (/usr/src/app/node_modules/tedious/lib/token/token-stream-parser.js:32:12)
at Readable.emit (node:events:526:28)
at endReadableNT (node:internal/streams/readable:1345:12)
at processTicksAndRejections (node:internal/process/task_queues:83:21)_
it seems that occurs after collecting database files size.
I try to put more rights to SQL login but no clue.
Any ideas ?
Regards,
Kristophe
When I put in my valid credentials, correct server name, and run the exporter, it starts but my MSSQL trace does not see the exporter on it and when I try to look at the metrics on port 4000 I get: cannot get /
Is there something Wrong that I put in my docker run command?
Hi ,
Is there a compatible Grafana dashboard which can be used ?
Thanks,
Soumen
Hi,
Any plans to run custom queries?
BTW, nice exporter.
Thanks
Francisco
这两个指标有什么区别
mssql_io_stall 是 从重启到现在 总的io 请求等待时间? 还是瞬时的
Some of the metrics should be exported as counter instead of gauge as they are (except for server restarts) monotonically increasing. This would be more in line with the metric types of Prometheus: https://prometheus.io/docs/concepts/metric_types/
I see 95 percentage in mssql_memory_utilization_percentage but doesn't correlate with mssql_total_physical_memory_kb and mssql_available_physical_memory_kb information, I've enough memory available but still the utilization percentage shows more than 90%.
Grafana v7.1.1
Prometheus build date: 20200722-18:51:4
Grafana Dashboard : https://grafana.com/grafana/dashboards/9336
The number of connections based on sys.dm_exec_sessions and sys.sysprocesses is inconsistent. Is that right?
you said : mssql_batch_requests , Number of Transact-SQL command batches received per second.
but the value that i get from my server is a big value and always going to increase
thanks for your code :)
After I build the Dockerfile and run docker run -e SERVER=192.168.56.101 -e USERNAME=SA -e PASSWORD=qkD4x3yy -e DEBUG=app -p 4000:4000 --name prometheus-mssql-exporter awaragi/prometheus-mssql-exporter
with my information, I get the error C:\Program Files\Docker Toolbox\docker.exe: invalid reference format: repository name must be lowercase.
Is there a fix for this?
Hello.
I'm trying to use this exporter to scrape data from Azure SQL server.
SQL Server version: Microsoft SQL Azure (RTM) - 12.0.2000.8
I'm using admin account, so it should have all the required privileges.
Can you please help me to troubleshoot the issue?
Thanks.
Attaching the output:
2022-04-16T12:53:52.954Z app Prometheus-MSSQL Exporter listening on local port 4000 monitoring [email protected]:1433
2022-04-16T12:54:34.329Z app Received metrics request
2022-04-16T12:54:34.329Z db Connecting to database somecompany-development.database.windows.net using user PDadmin
"name": "BigInt"
},
"colName": "cntr_value"
}
}
],
[
{
"value": "master",
"metadata": {
"userType": 0,
"flags": 33,
"type": {
"id": 231,
"type": "NVARCHAR",
"name": "NVarChar",
"maximumLength": 4000
},
"collation": {
"lcid": 1033,
"flags": 13,
"version": 0,
"sortId": 52,
"codepage": "CP1252"
},
"dataLength": 256,
"colName": ""
}
},
{
"value": "2",
"metadata": {
"userType": 0,
"flags": 8,
"type": {
"id": 127,
"type": "INT8",
"name": "BigInt"
},
"colName": "cntr_value"
}
}
]
]
2022-04-16T12:54:34.487Z metrics Fetched number log growths for database c21afb94-8777-409e-995e-b015f008ae99 0
2022-04-16T12:54:34.490Z metrics Fetched number log growths for database msdb 2
2022-04-16T12:54:34.490Z metrics Fetched number log growths for database tempdb 0
2022-04-16T12:54:34.490Z metrics Fetched number log growths for database model_masterdb 0
2022-04-16T12:54:34.490Z metrics Fetched number log growths for database model_userdb 0
2022-04-16T12:54:34.490Z metrics Fetched number log growths for database model 0
2022-04-16T12:54:34.490Z metrics Fetched number log growths for database mssqlsystemresource 0
2022-04-16T12:54:34.490Z metrics Fetched number log growths for database master 2
2022-04-16T12:54:34.490Z queries Executing query: SELECT DB_NAME(database_id) AS database_name, name AS logical_name, type, physical_name, (size * CAST(8 AS BIGINT)) size_kb FROM sys.master_files
Error executing SQL query SELECT DB_NAME(database_id) AS database_name, name AS logical_name, type, physical_name, (size * CAST(8 AS BIGINT)) size_kb FROM sys.master_files RequestError: Invalid object name 'sys.master_files'.
at RequestTokenHandler.onErrorMessage (/usr/src/app/node_modules/tedious/lib/token/handler.js:360:21)
at Readable.<anonymous> (/usr/src/app/node_modules/tedious/lib/token/token-stream-parser.js:26:33)
at Readable.emit (node:events:526:28)
at addChunk (node:internal/streams/readable:315:12)
at readableAddChunk (node:internal/streams/readable:289:9)
at Readable.push (node:internal/streams/readable:228:10)
at next (node:internal/streams/from:98:31)
at processTicksAndRejections (node:internal/process/task_queues:96:5) {
code: 'EREQUEST',
number: 208,
state: 1,
class: 16,
serverName: 'somecompany-development',
procName: '',
lineNumber: 1
}
2022-04-16T12:54:34.497Z queries Executing query:
SELECT * FROM
(
SELECT rtrim(counter_name) as counter_name, cntr_value
FROM sys.dm_os_performance_counters
WHERE counter_name in ('Page reads/sec', 'Page writes/sec', 'Page life expectancy', 'Lazy writes/sec', 'Checkpoint pages/sec')
AND object_name = 'SQLServer:Buffer Manager'
) d
PIVOT
(
MAX(cntr_value)
FOR counter_name IN ([Page reads/sec], [Page writes/sec], [Page life expectancy], [Lazy writes/sec], [Checkpoint pages/sec])
) piv
2022-04-16T12:54:34.526Z queries Retrieved rows []
/usr/src/app/metrics.js:232
const page_read = row[0].value;
^
TypeError: Cannot read properties of undefined (reading '0')
at Object.collect (/usr/src/app/metrics.js:232:26)
at Request.userCallback (/usr/src/app/index.js:82:19)
at Request.callback (/usr/src/app/node_modules/tedious/lib/request.js:205:14)
at Parser.onEndOfMessage (/usr/src/app/node_modules/tedious/lib/connection.js:2854:22)
at Object.onceWrapper (node:events:645:28)
at Parser.emit (node:events:526:28)
at Readable.<anonymous> (/usr/src/app/node_modules/tedious/lib/token/token-stream-parser.js:32:12)
at Readable.emit (node:events:526:28)
at endReadableNT (node:internal/streams/readable:1345:12)
at processTicksAndRejections (node:internal/process/task_queues:83:21)
Stream closed EOF for monitoring/mssql-exporter-548df548c-j6lnq (mssql-exporter)
Was able to start and auth with this using the docker container, but got a warning and an error that I thought I'd report:
(node:1) [DEP0064] DeprecationWarning: tls.createSecurePair() is deprecated. Please use tls.Socket instead.
Error executing SQL query SELECT
cast(DB_Name(a.database_id) as varchar) as name,
max(io_stall_read_ms),
max(io_stall_write_ms),
max(io_stall),
max(io_stall_queued_read_ms),
max(io_stall_queued_write_ms)
FROM
sys.dm_io_virtual_file_stats(null, null) a
INNER JOIN sys.master_files b ON a.database_id = b.database_id and a.file_id = b.file_id
group by a.database_id { RequestError: Invalid column name 'io_stall_queued_write_ms'.
at RequestError (/usr/src/app/node_modules/tedious/lib/errors.js:34:12)
at Parser.<anonymous> (/usr/src/app/node_modules/tedious/lib/connection.js:364:36)
at emitOne (events.js:115:13)
at Parser.emit (events.js:210:7)
at Parser.<anonymous> (/usr/src/app/node_modules/tedious/lib/token/token-stream-parser.js:54:15)
at emitOne (events.js:115:13)
at Parser.emit (events.js:210:7)
at addChunk (/usr/src/app/node_modules/readable-stream/lib/_stream_readable.js:284:12)
at readableAddChunk (/usr/src/app/node_modules/readable-stream/lib/_stream_readable.js:271:11)
at Parser.Readable.push (/usr/src/app/node_modules/readable-stream/lib/_stream_readable.js:238:10)
message: 'Invalid column name \'io_stall_queued_write_ms\'.',
code: 'EREQUEST',
number: 207,
state: 1,
class: 16,
serverName: 'MSSQL-01',
procName: '',
lineNumber: 7 }
Hi,
Background:
$ curl localhost:4000/metrics
# HELP up UP Status
# TYPE up gauge
up 1
[..]
up
is a auto-generated metric by Prometheus often assumed to be referring to whether the exporter is reachable or not. By including it in the response it causes e.g. the commonly used TargetDown alert to fire which are usually only for exporters themselves - e.g. checking the Prometheus "Targets" page would not list this instance. Indeed, given that the up
metric does not contain anything to differentiate itself, it is virtually impossible to distinguish between "Is the exporter down, or the whole database?".
Instead, if you look at other black-box style exporters you see probe_success
and similar metrics.
Thanks for your consideration,
The Docker command to start it should include the -d
option to start the container in the background, otherwise the container exits as soon as you type ^C.
I must be my admin or user with required permissions
After running the docker command with container up and running, this is all I got from my-ip-addr:4000/metrics page:
# HELP mssql_up UP Status
# TYPE mssql_up gauge
mssql_up 0
Where should one be looking at for complete list of mssql metrics?
I'm trying to connect this to a SQL instance, but I can't figure out how to get the exporter to connect in to a SQL server in the format servername\instancename.
docker logs xxx
...
Failed to connect to database: Failed to connect to xxx:1433
....
Q: Get the value 'database_id' dynamically.
tip:
get current databse_id:
select dbid from master..sysprocesses where spid=@@spid
Error executing metric mssql_client_connections SQL query SELECT host_name, DB_NAME(database_id), COUNT(*)
FROM sys.dm_exec_sessions
WHERE is_user_process=1
GROUP BY host_name, database_id RequestError: Invalid column name 'database_id'.
at RequestTokenHandler.onErrorMessage (/usr/src/app/node_modules/tedious/lib/token/handler.js:360:21)
at Readable. (/usr/src/app/node_modules/tedious/lib/token/token-stream-parser.js:26:33)
at Readable.emit (node:events:526:28)
at addChunk (node:internal/streams/readable:315:12)
at readableAddChunk (node:internal/streams/readable:289:9)
at Readable.push (node:internal/streams/readable:228:10)
at next (node:internal/streams/from:98:31)
at runMicrotasks ()
at processTicksAndRejections (node:internal/process/task_queues:96:5) {
code: 'EREQUEST',
number: 207,
state: 1,
class: 16,
serverName: 'STANDBY',
procName: '',
lineNumber: 1
}
Error executing metric mssql_io_stall SQL query SELECT
cast(DB_Name(a.database_id) as varchar) as name,
max(io_stall_read_ms),
max(io_stall_write_ms),
max(io_stall),
max(io_stall_queued_read_ms),
max(io_stall_queued_write_ms)
FROM
sys.dm_io_virtual_file_stats(null, null) a
INNER JOIN sys.master_files b ON a.database_id = b.database_id and a.file_id = b.file_id
GROUP BY a.database_id RequestError: Invalid column name 'io_stall_queued_write_ms'.
at RequestTokenHandler.onErrorMessage (/usr/src/app/node_modules/tedious/lib/token/handler.js:360:21)
at Readable. (/usr/src/app/node_modules/tedious/lib/token/token-stream-parser.js:26:33)
at Readable.emit (node:events:526:28)
at addChunk (node:internal/streams/readable:315:12)
at readableAddChunk (node:internal/streams/readable:289:9)
at Readable.push (node:internal/streams/readable:228:10)
at next (node:internal/streams/from:98:31)
at runMicrotasks ()
at processTicksAndRejections (node:internal/process/task_queues:96:5) {
code: 'EREQUEST',
number: 207,
state: 1,
class: 16,
serverName: 'STANDBY',
procName: '',
lineNumber: 7
}
SSL routines:ssl_choose_client_version:unsupported protocol:../deps/openssl/openssl/ssl/statem/statem_lib.c:1993:
when i run "npm start" on windows , its show
'DEBUG' is not recognized as an internal or external command,operable program or batch file.
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.