Code Monkey home page Code Monkey logo

agent-attach-java's Introduction

agent-attach-java

说明

默认将 dd-java-agent.jar 动态插入正在运行的 java 服务中。 也可以使用别的 agent。

原理

Attach 根本原理是使用文件 Socket 通讯, 就是往一个文件中写入 load instrument xxx.jar=params, 再给 jvm 一个 SIGQUIT 信号, 之后 jvm 读取 socket 文件, 加载对应的 agent.

how to use

使用 -h 查看:

root@q-PC:agent-attach-java$ java -jar target/agent-attach-java-jar-with-dependencies.jar -h
java -jar agent-attach-java.jar [-options <dd options>]
                                [-agent-jar <agent filepath>]
                                [-pid <pid>]
                                [-displayName <service name/displayName>]
                                [-h]
                                [-help]
[-options]:
   this is dd-java-agnet.jar env, example:
       dd.agent.port=9529,dd.agent.host=localhost,dd.service=serviceName,...
[-agent-jar]:
   default is: /usr/local/ddtrace/dd-java-agent.jar
[-pid]:
   service PID String
[-displayName]:
   service name
Note: -pid or -displayName must have a non empty !!!

[-download]
    guance ddtrace: https://static.guance.com/dd-image/dd-java-agent.jar
example command line:
java -jar agent-attach-java.jar -options 'dd.service=test,dd.tag=v1'\
 -displayName tmall.jar \
 -agent-jar /usr/local/ddtrace/dd-java-agent.jar

参数说明:

  • "-options" ddtrace 参数 :"dd.agent.host=localhost,dd.agent.port=9529,dd.service=mytest ... "
  • "-agent-jar" agent 路径 默认为:/usr/local/ddtrace/dd-java-agent.jar
  • "-pid" 进程 pid
  • "-displayName" 进程名称 比如 -displayName tmall.jar 注意 pid 和 displayName 必须有一个非空。
  • "-download" 观测云版本的 ddtrace 地址: https://static.guance.com/dd-image/dd-java-agent.jar
  • "-h or -help" 帮助

build

由于从 jdk9 开始就没有 tools.jar 文件。所以在项目目录下带上了tools文件: lib/tools.jar 是 jdk1.8 版本的。

建议本地编译:

JDK 版本 1.8 和 1.8 以上不可以交叉使用。

如使用发布版本 请使用相应的 releases 版本{:target="_blank"}

建议下载源码 并编译:

git clone https://github.com/GuanceCloud/agent-attach-java

如果是 JDK 1.8 版本,修改配置文件 pom.xml:

<!--将版本修改为 1.8 -->
    <configuration>
      <source>1.8</source>
      <target>1.8</target>
    </configuration>
    
    <!--将下面的注释放开,并将 tools.jar 注释掉 !!!-->
    <dependency>
      <groupId>io.earcam.wrapped</groupId>
      <artifactId>com.sun.tools.attach</artifactId>
      <version>1.8.0_jdk8u131-b11</version>
      <scope>compile</scope>
      <type>jar</type>
    </dependency>

如果版本是 JDK 9、11、17 使用以下配置 pom.xml:

<!--将目标版本修改为指定的版本-->
    <configuration>
        <source>11</source>
        <target>11</target>
    </configuration>

<!--    <dependency>
      <groupId>io.earcam.wrapped</groupId>
      <artifactId>com.sun.tools.attach</artifactId>
      <version>1.8.0_jdk8u131-b11</version>
      <scope>compile</scope>
      <type>jar</type>
    </dependency>-->
    <dependency>
      <groupId>com.sun</groupId>
      <artifactId>tools</artifactId>
      <version>1.8.0</version>
      <scope>system</scope>
      <systemPath>${project.basedir}/lib/tools.jar</systemPath>
    </dependency>
mvn package
# 使用 target/agent-attach-java-jar-with-dependencies.jar
rm -f target/agent-attach-java.jar
mv target/agent-attach-java-jar-with-dependencies.jar agent-attach-java.jar

文档

文档位置: 观测云docs-attach-agent

agent-attach-java's People

Contributors

songlonqi-java avatar

Stargazers

 avatar  avatar  avatar

Watchers

 avatar  avatar

Forkers

liukunyuan

agent-attach-java's Issues

本地编译运行报错

报错信息:

[root@APPServer javaapp]# java -jar  agent-attach-java-jar-with-dependencies.jar -options "dd.agent.port=9529" > error.log
java.util.ServiceConfigurationError: com.sun.tools.attach.spi.AttachProvider: Provider io.earcam.wrapped.com.sun.tools.attach.Provider could not be instantiated
        at java.base/java.util.ServiceLoader.fail(ServiceLoader.java:582)
        at java.base/java.util.ServiceLoader$ProviderImpl.newInstance(ServiceLoader.java:804)
        at java.base/java.util.ServiceLoader$ProviderImpl.get(ServiceLoader.java:722)
        at java.base/java.util.ServiceLoader$3.next(ServiceLoader.java:1395)
        at jdk.attach/com.sun.tools.attach.spi.AttachProvider.providers(AttachProvider.java:260)
        at jdk.attach/com.sun.tools.attach.VirtualMachine.list(VirtualMachine.java:144)
        at com.guance.javaagent.JavaAgentLoader.loadAgent(JavaAgentLoader.java:20)
        at com.guance.javaagent.MyMainClass.main(MyMainClass.java:20)
Caused by: java.lang.NoClassDefFoundError: sun/tools/attach/WindowsAttachProvider
        at io.earcam.wrapped.com.sun.tools.attach.Provider.findProvider(Provider.java:33)
        at io.earcam.wrapped.com.sun.tools.attach.Provider.<init>(Provider.java:25)
        at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
        at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
        at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
        at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:490)
        at java.base/java.util.ServiceLoader$ProviderImpl.newInstance(ServiceLoader.java:780)
        ... 6 more
Caused by: java.lang.ClassNotFoundException: sun.tools.attach.WindowsAttachProvider
        at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:581)
        at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178)
        at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:522)
        ... 13 more

Exception in thread "main" java.lang.RuntimeException: java.io.IOException: Can not attach to current VM
        at com.guance.javaagent.JavaAgentLoader.loadAgent(JavaAgentLoader.java:34)
        at com.guance.javaagent.MyMainClass.main(MyMainClass.java:20)
Caused by: java.io.IOException: Can not attach to current VM
        at jdk.attach/sun.tools.attach.HotSpotVirtualMachine.<init>(HotSpotVirtualMachine.java:75)
        at jdk.attach/sun.tools.attach.VirtualMachineImpl.<init>(VirtualMachineImpl.java:57)
        at jdk.attach/sun.tools.attach.AttachProviderImpl.attachVirtualMachine(AttachProviderImpl.java:58)
        at jdk.attach/com.sun.tools.attach.VirtualMachine.attach(VirtualMachine.java:207)
        at com.guance.javaagent.JavaAgentLoader.loadAgent(JavaAgentLoader.java:24)
        ... 1 more

环境: JDK 11.0.15

Window 加载 ddtrace 异常

环境

  • Window 11
  • JDK"1.8.0_333"

RUN

1. 启动应用

java -jar -Dloader.path="lib/" springboot-server2.jar

2. 启动 agent

java -Xbootclasspath/a:$JAVA_HOME/lib/tools.jar -jar agent-attach-java-jar-with-dependencies.jar -options "dd.agent.port=9529,dd.trace.debug=true" -displayName springboot-server2.jar -agent-jar D:/Desktop/target/target/dd-java-agent-1.21.1-guance.jar


Exception

  • java.io.FileNotFoundException: JAR entry nst/META-INF/services/datadog.trace.agent.tooling.Instrumenter not found in D:\Desktop\target\target\dd-java-agent-1.21.1-guance.jar
  • java.io.FileNotFoundException: JAR entry nst/known-types.index not found in D:\Desktop\target\target\dd-java-agent-1.21.1-guance.jar

应用日志

2023-12-12 16:14:51.226 [main] INFO  c.z.o.s.ServerApplication - [logStarted,57] [traceId= spanId=] - Started ServerApplication in 3.837 seconds (JVM running for 4.407)
....................
1.21.1-guance~cd83f12e1b
set dd.agent.port = 9529
set dd.trace.debug = true
[dd.trace 2023-12-12 16:15:00:153 +0800] [Attach Listener] ERROR datadog.trace.agent.tooling.Instrumenters - Failed to load - instrumentation.class list
java.io.FileNotFoundException: JAR entry nst/META-INF/services/datadog.trace.agent.tooling.Instrumenter not found in D:\Desktop\target\target\dd-java-agent-1.21.1-guance.jar
        at org.springframework.boot.loader.jar.JarURLConnection.throwFileNotFound(JarURLConnection.java:129)
        at org.springframework.boot.loader.jar.JarURLConnection.connect(JarURLConnection.java:117)
        at org.springframework.boot.loader.jar.JarURLConnection.getInputStream(JarURLConnection.java:185)
        at java.net.URL.openStream(URL.java:1092)
        at datadog.trace.agent.tooling.Instrumenters.loadInstrumenterNames(Instrumenters.java:105)
        at datadog.trace.agent.tooling.Instrumenters.load(Instrumenters.java:32)
        at datadog.trace.agent.tooling.AgentInstaller.installBytebuddyAgent(AgentInstaller.java:146)
        at datadog.trace.agent.tooling.AgentInstaller.installBytebuddyAgent(AgentInstaller.java:69)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:498)
        at datadog.trace.bootstrap.Agent.startDatadogAgent(Agent.java:543)
        at datadog.trace.bootstrap.Agent.start(Agent.java:243)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:498)
        at datadog.trace.bootstrap.AgentBootstrap.agentmain(AgentBootstrap.java:86)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:498)
        at sun.instrument.InstrumentationImpl.loadClassAndStartAgent(InstrumentationImpl.java:386)
        at sun.instrument.InstrumentationImpl.loadClassAndCallAgentmain(InstrumentationImpl.java:411)
[dd.trace 2023-12-12 16:15:00:163 +0800] [Attach Listener] DEBUG datadog.trace.agent.tooling.AgentInstaller - Installed 0 instrumenter(s)
[dd.trace 2023-12-12 16:15:00:165 +0800] [Attach Listener] ERROR datadog.trace.agent.tooling.KnownTypesIndex - Problem reading known-types.index
java.io.FileNotFoundException: JAR entry nst/known-types.index not found in D:\Desktop\target\target\dd-java-agent-1.21.1-guance.jar
        at org.springframework.boot.loader.jar.JarURLConnection.throwFileNotFound(JarURLConnection.java:129)
        at org.springframework.boot.loader.jar.JarURLConnection.connect(JarURLConnection.java:117)
        at org.springframework.boot.loader.jar.JarURLConnection.getInputStream(JarURLConnection.java:185)
        at java.net.URL.openStream(URL.java:1092)
        at datadog.trace.agent.tooling.KnownTypesIndex.readIndex(KnownTypesIndex.java:60)
        at datadog.trace.agent.tooling.CombiningMatcher.<clinit>(CombiningMatcher.java:26)
        at datadog.trace.agent.tooling.CombiningTransformerBuilder.installOn(CombiningTransformerBuilder.java:194)
        at datadog.trace.agent.tooling.AgentInstaller.installBytebuddyAgent(AgentInstaller.java:210)
        at datadog.trace.agent.tooling.AgentInstaller.installBytebuddyAgent(AgentInstaller.java:69)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:498)
        at datadog.trace.bootstrap.Agent.startDatadogAgent(Agent.java:543)
        at datadog.trace.bootstrap.Agent.start(Agent.java:243)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:498)
        at datadog.trace.bootstrap.AgentBootstrap.agentmain(AgentBootstrap.java:86)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:498)
        at sun.instrument.InstrumentationImpl.loadClassAndStartAgent(InstrumentationImpl.java:386)
        at sun.instrument.InstrumentationImpl.loadClassAndCallAgentmain(InstrumentationImpl.java:411)
[dd.trace 2023-12-12 16:15:00:168 +0800] [Attach Listener] DEBUG datadog.trace.agent.tooling.KnownTypesIndex - Generating KnownTypesIndex

[dd.trace 2023-12-12 16:15:00:257 +0800] [Attach Listener] DEBUG datadog.trace.agent.tooling.AgentInstaller - Instrumentation installed for [TRACING, APPSEC]
[dd.trace 2023-12-12 16:15:00:285 +0800] [Attach Listener] DEBUG datadog.trace.api.Config - Determined hostname from environment variable
[dd.trace 2023-12-12 16:15:00:285 +0800] [Attach Listener] DEBUG datadog.trace.api.Config - New instance: Config{instrumenterConfig=InstrumenterConfig{integrationsEnabled=true, traceEnabled=true, traceOtelEnabled=false, logs128bTraceIdEnabled=false, profilingEnabled=false, ciVisibilityEnabled=false, appSecActivation=ENABLED_INACTIVE, iastActivation=FULLY_DISABLED, usmEnabled=false, telemetryEnabled=true, traceExecutorsAll=false, traceExecutors=[], jdbcPreparedStatementClassName='', jdbcConnectionClassName='', excludedClasses=[], excludedClassesFile=null, excludedClassLoaders=[], excludedCodeSources=[], resolverCacheConfig=MEMOS, resolverCacheDir=null, resolverNamesAreUnique=false, resolverUseLoadClass=true, resolverUseUrlCaches=null, resolverResetInterval=300, runtimeContextFieldInjection=true, serialVersionUIDFieldInjection=true, traceAnnotations='null', traceAnnotationAsync=false, traceMethods='{}', measureMethods= '{}', internalExitOnFailure=false, legacyInstallerEnabled=false}, runtimeId='12f34dfd-9468-4bf5-80bc-2925ce10c0de', runtimeVersion='1.8.0_333, apiKey=null, site='datadoghq.com', hostName='DESKTOP-3JJLRI8', serviceName='springboot-server2', serviceNameSetByUser=false, rootContextServiceName=root-servlet, integrationSynapseLegacyOperationName=false, writerType='DDAgentWriter', agentConfiguredUsingDefault=false, agentUrl='http://localhost:9529', agentHost='localhost', agentPort=9529, agentUnixDomainSocket='null', agentTimeout=10, noProxyHosts=[], prioritySamplingEnabled=true, prioritySamplingForce='null', traceResolverEnabled=true, serviceMapping={}, tags={}, spanTags={}, jmxTags={}, requestHeaderTags={}, responseHeaderTags={}, baggageMapping={}, httpServerErrorStatuses={500, 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, 530, 531, 532, 533, 534, 535, 536, 537, 538, 539, 540, 541, 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, 552, 553, 554, 555, 556, 557, 558, 559, 560, 561, 562, 563, 564, 565, 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, 576, 577, 578, 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, 589, 590, 591, 592, 593, 594, 595, 596, 597, 598, 599}, httpClientErrorStatuses={400, 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, 458, 459, 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, 470, 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, 499}, httpServerTagQueryString=true, httpServerRawQueryString=true, httpServerRawResource=false, httpServerRouteBasedNaming=true, httpServerPathResourceNameMapping={}, httpClientPathResourceNameMapping={}, httpClientTagQueryString=false, httpClientSplitByDomain=false, httpResourceRemoveTrailingSlashfalse, dbClientSplitByInstance=false, dbClientSplitByInstanceTypeSuffix=false, DBMPropagationMode=disabled, splitByTags=[], scopeDepthLimit=100, scopeStrictMode=false, scopeInheritAsyncPropagation=true, scopeIterationKeepAlive=30, partialFlushMinSpans=1000, traceStrictWritesEnabled=false, tracePropagationStylesToExtract=[datadog], tracePropagationStylesToInject=[datadog], clockSyncPeriod=30, jmxFetchEnabled=true, dogStatsDStartDelay=15, jmxFetchConfigDir='null', jmxFetchConfigs=[], jmxFetchMetricsConfigs=[], jmxFetchCheckPeriod=null, jmxFetchInitialRefreshBeansPeriod=null, jmxFetchRefreshBeansPeriod=null, jmxFetchStatsdHost='null', jmxFetchStatsdPort=null, jmxFetchMultipleRuntimeServicesEnabled=false, jmxFetchMultipleRuntimeServicesLimit=10, healthMetricsEnabled=true, healthMetricsStatsdHost='null', healthMetricsStatsdPort=null, perfMetricsEnabled=false, tracerMetricsEnabled=false, tracerMetricsBufferingEnabled=false, tracerMetricsMaxAggregates=2048, tracerMetricsMaxPending=2048, logsInjectionEnabled=true, logsMDCTagsInjectionEnabled=true, logPattern=%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger - [%method,%line] %X{dd.service} %X{dd.trace_id} %X{dd.span_id} - %msg%n, logPatternReplace=false, reportHostName=false, traceAnalyticsEnabled=false, traceSamplingServiceRules={}, traceSamplingOperationRules={}, traceSamplingJsonRules=null, traceSampleRate=null, traceRateLimit=100, spanSamplingRules=null, spanSamplingRulesFile=null, profilingAgentless=false, profilingUrl='null', profilingTags={}, profilingStartDelay=10, profilingStartForceFirst=false, profilingUploadPeriod=60, profilingTemplateOverrideFile='null', profilingUploadTimeout=30, profilingUploadCompression='on', profilingProxyHost='null', profilingProxyPort=8080, profilingProxyUsername='null', profilingProxyPassword=null, profilingExceptionSampleLimit=10000, profilingExceptionHistogramTopItems=50, profilingExceptionHistogramMaxCollectionSize=10000, profilingExcludeAgentThreads=true, crashTrackingTags={}, crashTrackingAgentless=false, remoteConfigEnabled=true, remoteConfigUrl=null, remoteConfigPollIntervalSeconds=5.0, remoteConfigMaxPayloadSize=5242880, remoteConfigIntegrityCheckEnabled=false, debuggerEnabled=false, debuggerUploadTimeout=30, debuggerUploadFlushInterval=0, debuggerClassFileDumpEnabled=false, debuggerPollInterval=1, debuggerDiagnosticsInterval=3600, debuggerMetricEnabled=true, debuggerProbeFileLocation=null, debuggerUploadBatchSize=100, debuggerMaxPayloadSize=1048576, debuggerVerifyByteCode=true, debuggerInstrumentTheWorld=false, debuggerExcludeFile=null, awsPropagationEnabled=true, sqsPropagationEnabled=true, kafkaClientPropagationEnabled=true, kafkaClientPropagationDisabledTopics=[], kafkaClientBase64DecodingEnabled=false, jmsPropagationEnabled=true, jmsPropagationDisabledTopics=[], jmsPropagationDisabledQueues=[], rabbitPropagationEnabled=true, rabbitPropagationDisabledQueues=[], rabbitPropagationDisabledExchanges=[], messageBrokerSplitByDestination=false, hystrixTagsEnabled=false, hystrixMeasuredEnabled=false, igniteCacheIncludeKeys=false, servletPrincipalEnabled=false, servletAsyncTimeoutError=true, datadogTagsLimit=512, traceAgentV05Enabled=false, debugEnabled=true, startLogsEnabled=true, configFile='no config file present', idGenerationStrategy=datadog.trace.api.IdGenerationStrategy$Random@41e352fa, trace128bitTraceIdGenerationEnabledfalse, grpcIgnoredInboundMethods=[], grpcIgnoredOutboundMethods=[], grpcServerErrorStatuses={2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16}, grpcClientErrorStatuses={1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16}, clientIpEnabled=false, appSecReportingInband=false, appSecRulesFile='null', appSecHttpBlockedTemplateHtml=null, appSecWafTimeout=100000 us, appSecHttpBlockedTemplateJson=null, cwsEnabled=false, cwsTlsRefresh=5000, longRunningTraceEnabled=false, longRunningTraceFlushInterval=300, elasticsearchBodyEnabled=false, elasticsearchParamsEnabled=true, elasticsearchBodyAndParamsEnabled=false, traceFlushInterval=1.0, injectBaggageAsTagsEnabled=true, logsInjectionEnabled=true, sparkTaskHistogramEnabled=true, jaxRsExceptionAsErrorsEnabled=true, peerServiceDefaultsEnabled=false, peerServiceComponentOverrides={}, removeIntegrationServiceNamesEnabled=false, spanAttributeSchemaVersion=0}
[dd.trace 2023-12-12 16:15:00:316 +0800] [Attach Listener] DEBUG datadog.communication.monitor.DDAgentStatsDConnection - Scheduling StatsD connection in 15 seconds - <auto-detect>

支持下载路径

命令行形式下载

java -jar agent-attach-java.jar -options "dd.agent.port=9529" -download https://github.com/GuanceCloud/dd-trace-java/releases/download/<version>/dd-java-agent.jar

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.