feat(analytics): vendor code for google analytics

Signed-off-by: Pawan <pawan@mayadata.io>
This commit is contained in:
Pawan 2020-02-26 11:32:22 +05:30 committed by Kiran Mova
parent d608dbacd8
commit dc5edb901c
23 changed files with 2620 additions and 0 deletions

30
Gopkg.lock generated
View file

@ -33,6 +33,14 @@
revision = "8991bc29aa16c548c550c7ff78260e27b9ab7c73" revision = "8991bc29aa16c548c550c7ff78260e27b9ab7c73"
version = "v1.1.1" version = "v1.1.1"
[[projects]]
digest = "1:e95ef557dc3120984bb66b385ae01b4bb8ff56bcde28e7b0d1beed0cccc4d69f"
name = "github.com/docker/go-units"
packages = ["."]
pruneopts = "UT"
revision = "519db1ee28dcc9fd2474ae59fca29a810482bfb1"
version = "v0.4.0"
[[projects]] [[projects]]
branch = "master" branch = "master"
digest = "1:ecdc8e0fe3bc7d549af1c9c36acf3820523b707d6c071b6d0c3860882c6f7b42" digest = "1:ecdc8e0fe3bc7d549af1c9c36acf3820523b707d6c071b6d0c3860882c6f7b42"
@ -157,6 +165,14 @@
revision = "76626ae9c91c4f2a10f34cad8ce83ea42c93bb75" revision = "76626ae9c91c4f2a10f34cad8ce83ea42c93bb75"
version = "v1.0" version = "v1.0"
[[projects]]
branch = "master"
digest = "1:289a0aeeff2a467506d6faacb71c783a8610e53639e8f065e1997a569e622d6b"
name = "github.com/jpillora/go-ogle-analytics"
packages = ["."]
pruneopts = "UT"
revision = "14b04e0594ef6a9fd943363b135656f0ec8c9d0e"
[[projects]] [[projects]]
digest = "1:709cd2a2c29cc9b89732f6c24846bbb9d6270f28ef5ef2128cc73bd0d6d7bff9" digest = "1:709cd2a2c29cc9b89732f6c24846bbb9d6270f28ef5ef2128cc73bd0d6d7bff9"
name = "github.com/json-iterator/go" name = "github.com/json-iterator/go"
@ -867,22 +883,30 @@
input-imports = [ input-imports = [
"github.com/Sirupsen/logrus", "github.com/Sirupsen/logrus",
"github.com/container-storage-interface/spec/lib/go/csi", "github.com/container-storage-interface/spec/lib/go/csi",
"github.com/docker/go-units",
"github.com/ghodss/yaml", "github.com/ghodss/yaml",
"github.com/golang/protobuf/ptypes/timestamp",
"github.com/jpillora/go-ogle-analytics",
"github.com/kubernetes-csi/csi-lib-utils/protosanitizer", "github.com/kubernetes-csi/csi-lib-utils/protosanitizer",
"github.com/onsi/ginkgo", "github.com/onsi/ginkgo",
"github.com/onsi/gomega", "github.com/onsi/gomega",
"github.com/pkg/errors", "github.com/pkg/errors",
"github.com/spf13/cobra", "github.com/spf13/cobra",
"golang.org/x/net/context", "golang.org/x/net/context",
"golang.org/x/sys/unix",
"google.golang.org/grpc", "google.golang.org/grpc",
"google.golang.org/grpc/codes", "google.golang.org/grpc/codes",
"google.golang.org/grpc/status", "google.golang.org/grpc/status",
"k8s.io/api/apps/v1", "k8s.io/api/apps/v1",
"k8s.io/api/apps/v1beta1",
"k8s.io/api/batch/v1",
"k8s.io/api/core/v1", "k8s.io/api/core/v1",
"k8s.io/api/extensions/v1beta1",
"k8s.io/api/storage/v1", "k8s.io/api/storage/v1",
"k8s.io/apimachinery/pkg/api/errors", "k8s.io/apimachinery/pkg/api/errors",
"k8s.io/apimachinery/pkg/api/resource", "k8s.io/apimachinery/pkg/api/resource",
"k8s.io/apimachinery/pkg/apis/meta/v1", "k8s.io/apimachinery/pkg/apis/meta/v1",
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured",
"k8s.io/apimachinery/pkg/labels", "k8s.io/apimachinery/pkg/labels",
"k8s.io/apimachinery/pkg/runtime", "k8s.io/apimachinery/pkg/runtime",
"k8s.io/apimachinery/pkg/runtime/schema", "k8s.io/apimachinery/pkg/runtime/schema",
@ -890,6 +914,7 @@
"k8s.io/apimachinery/pkg/types", "k8s.io/apimachinery/pkg/types",
"k8s.io/apimachinery/pkg/util/runtime", "k8s.io/apimachinery/pkg/util/runtime",
"k8s.io/apimachinery/pkg/util/wait", "k8s.io/apimachinery/pkg/util/wait",
"k8s.io/apimachinery/pkg/version",
"k8s.io/apimachinery/pkg/watch", "k8s.io/apimachinery/pkg/watch",
"k8s.io/client-go/discovery", "k8s.io/client-go/discovery",
"k8s.io/client-go/discovery/fake", "k8s.io/client-go/discovery/fake",
@ -897,7 +922,11 @@
"k8s.io/client-go/informers", "k8s.io/client-go/informers",
"k8s.io/client-go/kubernetes", "k8s.io/client-go/kubernetes",
"k8s.io/client-go/kubernetes/scheme", "k8s.io/client-go/kubernetes/scheme",
"k8s.io/client-go/kubernetes/typed/apps/v1",
"k8s.io/client-go/kubernetes/typed/apps/v1beta1",
"k8s.io/client-go/kubernetes/typed/core/v1", "k8s.io/client-go/kubernetes/typed/core/v1",
"k8s.io/client-go/kubernetes/typed/extensions/v1beta1",
"k8s.io/client-go/kubernetes/typed/storage/v1",
"k8s.io/client-go/plugin/pkg/client/auth/gcp", "k8s.io/client-go/plugin/pkg/client/auth/gcp",
"k8s.io/client-go/rest", "k8s.io/client-go/rest",
"k8s.io/client-go/testing", "k8s.io/client-go/testing",
@ -912,6 +941,7 @@
"k8s.io/code-generator/cmd/defaulter-gen", "k8s.io/code-generator/cmd/defaulter-gen",
"k8s.io/code-generator/cmd/informer-gen", "k8s.io/code-generator/cmd/informer-gen",
"k8s.io/code-generator/cmd/lister-gen", "k8s.io/code-generator/cmd/lister-gen",
"k8s.io/klog",
"k8s.io/kubernetes/pkg/util/mount", "k8s.io/kubernetes/pkg/util/mount",
"sigs.k8s.io/controller-runtime/pkg/runtime/signals", "sigs.k8s.io/controller-runtime/pkg/runtime/signals",
] ]

67
vendor/github.com/docker/go-units/CONTRIBUTING.md generated vendored Normal file
View file

@ -0,0 +1,67 @@
# Contributing to go-units
Want to hack on go-units? Awesome! Here are instructions to get you started.
go-units is a part of the [Docker](https://www.docker.com) project, and follows
the same rules and principles. If you're already familiar with the way
Docker does things, you'll feel right at home.
Otherwise, go read Docker's
[contributions guidelines](https://github.com/docker/docker/blob/master/CONTRIBUTING.md),
[issue triaging](https://github.com/docker/docker/blob/master/project/ISSUE-TRIAGE.md),
[review process](https://github.com/docker/docker/blob/master/project/REVIEWING.md) and
[branches and tags](https://github.com/docker/docker/blob/master/project/BRANCHES-AND-TAGS.md).
### Sign your work
The sign-off is a simple line at the end of the explanation for the patch. Your
signature certifies that you wrote the patch or otherwise have the right to pass
it on as an open-source patch. The rules are pretty simple: if you can certify
the below (from [developercertificate.org](http://developercertificate.org/)):
```
Developer Certificate of Origin
Version 1.1
Copyright (C) 2004, 2006 The Linux Foundation and its contributors.
660 York Street, Suite 102,
San Francisco, CA 94110 USA
Everyone is permitted to copy and distribute verbatim copies of this
license document, but changing it is not allowed.
Developer's Certificate of Origin 1.1
By making a contribution to this project, I certify that:
(a) The contribution was created in whole or in part by me and I
have the right to submit it under the open source license
indicated in the file; or
(b) The contribution is based upon previous work that, to the best
of my knowledge, is covered under an appropriate open source
license and I have the right under that license to submit that
work with modifications, whether created in whole or in part
by me, under the same open source license (unless I am
permitted to submit under a different license), as indicated
in the file; or
(c) The contribution was provided directly to me by some other
person who certified (a), (b) or (c) and I have not modified
it.
(d) I understand and agree that this project and the contribution
are public and that a record of the contribution (including all
personal information I submit with it, including my sign-off) is
maintained indefinitely and may be redistributed consistent with
this project or the open source license(s) involved.
```
Then you just add a line to every git commit message:
Signed-off-by: Joe Smith <joe.smith@email.com>
Use your real name (sorry, no pseudonyms or anonymous contributions.)
If you set your `user.name` and `user.email` git configs, you can sign your
commit automatically with `git commit -s`.

191
vendor/github.com/docker/go-units/LICENSE generated vendored Normal file
View file

@ -0,0 +1,191 @@
Apache License
Version 2.0, January 2004
https://www.apache.org/licenses/
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
1. Definitions.
"License" shall mean the terms and conditions for use, reproduction,
and distribution as defined by Sections 1 through 9 of this document.
"Licensor" shall mean the copyright owner or entity authorized by
the copyright owner that is granting the License.
"Legal Entity" shall mean the union of the acting entity and all
other entities that control, are controlled by, or are under common
control with that entity. For the purposes of this definition,
"control" means (i) the power, direct or indirect, to cause the
direction or management of such entity, whether by contract or
otherwise, or (ii) ownership of fifty percent (50%) or more of the
outstanding shares, or (iii) beneficial ownership of such entity.
"You" (or "Your") shall mean an individual or Legal Entity
exercising permissions granted by this License.
"Source" form shall mean the preferred form for making modifications,
including but not limited to software source code, documentation
source, and configuration files.
"Object" form shall mean any form resulting from mechanical
transformation or translation of a Source form, including but
not limited to compiled object code, generated documentation,
and conversions to other media types.
"Work" shall mean the work of authorship, whether in Source or
Object form, made available under the License, as indicated by a
copyright notice that is included in or attached to the work
(an example is provided in the Appendix below).
"Derivative Works" shall mean any work, whether in Source or Object
form, that is based on (or derived from) the Work and for which the
editorial revisions, annotations, elaborations, or other modifications
represent, as a whole, an original work of authorship. For the purposes
of this License, Derivative Works shall not include works that remain
separable from, or merely link (or bind by name) to the interfaces of,
the Work and Derivative Works thereof.
"Contribution" shall mean any work of authorship, including
the original version of the Work and any modifications or additions
to that Work or Derivative Works thereof, that is intentionally
submitted to Licensor for inclusion in the Work by the copyright owner
or by an individual or Legal Entity authorized to submit on behalf of
the copyright owner. For the purposes of this definition, "submitted"
means any form of electronic, verbal, or written communication sent
to the Licensor or its representatives, including but not limited to
communication on electronic mailing lists, source code control systems,
and issue tracking systems that are managed by, or on behalf of, the
Licensor for the purpose of discussing and improving the Work, but
excluding communication that is conspicuously marked or otherwise
designated in writing by the copyright owner as "Not a Contribution."
"Contributor" shall mean Licensor and any individual or Legal Entity
on behalf of whom a Contribution has been received by Licensor and
subsequently incorporated within the Work.
2. Grant of Copyright License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
copyright license to reproduce, prepare Derivative Works of,
publicly display, publicly perform, sublicense, and distribute the
Work and such Derivative Works in Source or Object form.
3. Grant of Patent License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
(except as stated in this section) patent license to make, have made,
use, offer to sell, sell, import, and otherwise transfer the Work,
where such license applies only to those patent claims licensable
by such Contributor that are necessarily infringed by their
Contribution(s) alone or by combination of their Contribution(s)
with the Work to which such Contribution(s) was submitted. If You
institute patent litigation against any entity (including a
cross-claim or counterclaim in a lawsuit) alleging that the Work
or a Contribution incorporated within the Work constitutes direct
or contributory patent infringement, then any patent licenses
granted to You under this License for that Work shall terminate
as of the date such litigation is filed.
4. Redistribution. You may reproduce and distribute copies of the
Work or Derivative Works thereof in any medium, with or without
modifications, and in Source or Object form, provided that You
meet the following conditions:
(a) You must give any other recipients of the Work or
Derivative Works a copy of this License; and
(b) You must cause any modified files to carry prominent notices
stating that You changed the files; and
(c) You must retain, in the Source form of any Derivative Works
that You distribute, all copyright, patent, trademark, and
attribution notices from the Source form of the Work,
excluding those notices that do not pertain to any part of
the Derivative Works; and
(d) If the Work includes a "NOTICE" text file as part of its
distribution, then any Derivative Works that You distribute must
include a readable copy of the attribution notices contained
within such NOTICE file, excluding those notices that do not
pertain to any part of the Derivative Works, in at least one
of the following places: within a NOTICE text file distributed
as part of the Derivative Works; within the Source form or
documentation, if provided along with the Derivative Works; or,
within a display generated by the Derivative Works, if and
wherever such third-party notices normally appear. The contents
of the NOTICE file are for informational purposes only and
do not modify the License. You may add Your own attribution
notices within Derivative Works that You distribute, alongside
or as an addendum to the NOTICE text from the Work, provided
that such additional attribution notices cannot be construed
as modifying the License.
You may add Your own copyright statement to Your modifications and
may provide additional or different license terms and conditions
for use, reproduction, or distribution of Your modifications, or
for any such Derivative Works as a whole, provided Your use,
reproduction, and distribution of the Work otherwise complies with
the conditions stated in this License.
5. Submission of Contributions. Unless You explicitly state otherwise,
any Contribution intentionally submitted for inclusion in the Work
by You to the Licensor shall be under the terms and conditions of
this License, without any additional terms or conditions.
Notwithstanding the above, nothing herein shall supersede or modify
the terms of any separate license agreement you may have executed
with Licensor regarding such Contributions.
6. Trademarks. This License does not grant permission to use the trade
names, trademarks, service marks, or product names of the Licensor,
except as required for reasonable and customary use in describing the
origin of the Work and reproducing the content of the NOTICE file.
7. Disclaimer of Warranty. Unless required by applicable law or
agreed to in writing, Licensor provides the Work (and each
Contributor provides its Contributions) on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied, including, without limitation, any warranties or conditions
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
PARTICULAR PURPOSE. You are solely responsible for determining the
appropriateness of using or redistributing the Work and assume any
risks associated with Your exercise of permissions under this License.
8. Limitation of Liability. In no event and under no legal theory,
whether in tort (including negligence), contract, or otherwise,
unless required by applicable law (such as deliberate and grossly
negligent acts) or agreed to in writing, shall any Contributor be
liable to You for damages, including any direct, indirect, special,
incidental, or consequential damages of any character arising as a
result of this License or out of the use or inability to use the
Work (including but not limited to damages for loss of goodwill,
work stoppage, computer failure or malfunction, or any and all
other commercial damages or losses), even if such Contributor
has been advised of the possibility of such damages.
9. Accepting Warranty or Additional Liability. While redistributing
the Work or Derivative Works thereof, You may choose to offer,
and charge a fee for, acceptance of support, warranty, indemnity,
or other liability obligations and/or rights consistent with this
License. However, in accepting such obligations, You may act only
on Your own behalf and on Your sole responsibility, not on behalf
of any other Contributor, and only if You agree to indemnify,
defend, and hold each Contributor harmless for any liability
incurred by, or claims asserted against, such Contributor by reason
of your accepting any such warranty or additional liability.
END OF TERMS AND CONDITIONS
Copyright 2015 Docker, Inc.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
https://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.

46
vendor/github.com/docker/go-units/MAINTAINERS generated vendored Normal file
View file

@ -0,0 +1,46 @@
# go-units maintainers file
#
# This file describes who runs the docker/go-units project and how.
# This is a living document - if you see something out of date or missing, speak up!
#
# It is structured to be consumable by both humans and programs.
# To extract its contents programmatically, use any TOML-compliant parser.
#
# This file is compiled into the MAINTAINERS file in docker/opensource.
#
[Org]
[Org."Core maintainers"]
people = [
"akihirosuda",
"dnephin",
"thajeztah",
"vdemeester",
]
[people]
# A reference list of all people associated with the project.
# All other sections should refer to people by their canonical key
# in the people section.
# ADD YOURSELF HERE IN ALPHABETICAL ORDER
[people.akihirosuda]
Name = "Akihiro Suda"
Email = "akihiro.suda.cz@hco.ntt.co.jp"
GitHub = "AkihiroSuda"
[people.dnephin]
Name = "Daniel Nephin"
Email = "dnephin@gmail.com"
GitHub = "dnephin"
[people.thajeztah]
Name = "Sebastiaan van Stijn"
Email = "github@gone.nl"
GitHub = "thaJeztah"
[people.vdemeester]
Name = "Vincent Demeester"
Email = "vincent@sbr.pm"
GitHub = "vdemeester"

16
vendor/github.com/docker/go-units/README.md generated vendored Normal file
View file

@ -0,0 +1,16 @@
[![GoDoc](https://godoc.org/github.com/docker/go-units?status.svg)](https://godoc.org/github.com/docker/go-units)
# Introduction
go-units is a library to transform human friendly measurements into machine friendly values.
## Usage
See the [docs in godoc](https://godoc.org/github.com/docker/go-units) for examples and documentation.
## Copyright and license
Copyright © 2015 Docker, Inc.
go-units is licensed under the Apache License, Version 2.0.
See [LICENSE](LICENSE) for the full text of the license.

11
vendor/github.com/docker/go-units/circle.yml generated vendored Normal file
View file

@ -0,0 +1,11 @@
dependencies:
post:
# install golint
- go get golang.org/x/lint/golint
test:
pre:
# run analysis before tests
- go vet ./...
- test -z "$(golint ./... | tee /dev/stderr)"
- test -z "$(gofmt -s -l . | tee /dev/stderr)"

35
vendor/github.com/docker/go-units/duration.go generated vendored Normal file
View file

@ -0,0 +1,35 @@
// Package units provides helper function to parse and print size and time units
// in human-readable format.
package units
import (
"fmt"
"time"
)
// HumanDuration returns a human-readable approximation of a duration
// (eg. "About a minute", "4 hours ago", etc.).
func HumanDuration(d time.Duration) string {
if seconds := int(d.Seconds()); seconds < 1 {
return "Less than a second"
} else if seconds == 1 {
return "1 second"
} else if seconds < 60 {
return fmt.Sprintf("%d seconds", seconds)
} else if minutes := int(d.Minutes()); minutes == 1 {
return "About a minute"
} else if minutes < 60 {
return fmt.Sprintf("%d minutes", minutes)
} else if hours := int(d.Hours() + 0.5); hours == 1 {
return "About an hour"
} else if hours < 48 {
return fmt.Sprintf("%d hours", hours)
} else if hours < 24*7*2 {
return fmt.Sprintf("%d days", hours/24)
} else if hours < 24*30*2 {
return fmt.Sprintf("%d weeks", hours/24/7)
} else if hours < 24*365*2 {
return fmt.Sprintf("%d months", hours/24/30)
}
return fmt.Sprintf("%d years", int(d.Hours())/24/365)
}

108
vendor/github.com/docker/go-units/size.go generated vendored Normal file
View file

@ -0,0 +1,108 @@
package units
import (
"fmt"
"regexp"
"strconv"
"strings"
)
// See: http://en.wikipedia.org/wiki/Binary_prefix
const (
// Decimal
KB = 1000
MB = 1000 * KB
GB = 1000 * MB
TB = 1000 * GB
PB = 1000 * TB
// Binary
KiB = 1024
MiB = 1024 * KiB
GiB = 1024 * MiB
TiB = 1024 * GiB
PiB = 1024 * TiB
)
type unitMap map[string]int64
var (
decimalMap = unitMap{"k": KB, "m": MB, "g": GB, "t": TB, "p": PB}
binaryMap = unitMap{"k": KiB, "m": MiB, "g": GiB, "t": TiB, "p": PiB}
sizeRegex = regexp.MustCompile(`^(\d+(\.\d+)*) ?([kKmMgGtTpP])?[iI]?[bB]?$`)
)
var decimapAbbrs = []string{"B", "kB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB"}
var binaryAbbrs = []string{"B", "KiB", "MiB", "GiB", "TiB", "PiB", "EiB", "ZiB", "YiB"}
func getSizeAndUnit(size float64, base float64, _map []string) (float64, string) {
i := 0
unitsLimit := len(_map) - 1
for size >= base && i < unitsLimit {
size = size / base
i++
}
return size, _map[i]
}
// CustomSize returns a human-readable approximation of a size
// using custom format.
func CustomSize(format string, size float64, base float64, _map []string) string {
size, unit := getSizeAndUnit(size, base, _map)
return fmt.Sprintf(format, size, unit)
}
// HumanSizeWithPrecision allows the size to be in any precision,
// instead of 4 digit precision used in units.HumanSize.
func HumanSizeWithPrecision(size float64, precision int) string {
size, unit := getSizeAndUnit(size, 1000.0, decimapAbbrs)
return fmt.Sprintf("%.*g%s", precision, size, unit)
}
// HumanSize returns a human-readable approximation of a size
// capped at 4 valid numbers (eg. "2.746 MB", "796 KB").
func HumanSize(size float64) string {
return HumanSizeWithPrecision(size, 4)
}
// BytesSize returns a human-readable size in bytes, kibibytes,
// mebibytes, gibibytes, or tebibytes (eg. "44kiB", "17MiB").
func BytesSize(size float64) string {
return CustomSize("%.4g%s", size, 1024.0, binaryAbbrs)
}
// FromHumanSize returns an integer from a human-readable specification of a
// size using SI standard (eg. "44kB", "17MB").
func FromHumanSize(size string) (int64, error) {
return parseSize(size, decimalMap)
}
// RAMInBytes parses a human-readable string representing an amount of RAM
// in bytes, kibibytes, mebibytes, gibibytes, or tebibytes and
// returns the number of bytes, or -1 if the string is unparseable.
// Units are case-insensitive, and the 'b' suffix is optional.
func RAMInBytes(size string) (int64, error) {
return parseSize(size, binaryMap)
}
// Parses the human-readable size string into the amount it represents.
func parseSize(sizeStr string, uMap unitMap) (int64, error) {
matches := sizeRegex.FindStringSubmatch(sizeStr)
if len(matches) != 4 {
return -1, fmt.Errorf("invalid size: '%s'", sizeStr)
}
size, err := strconv.ParseFloat(matches[1], 64)
if err != nil {
return -1, err
}
unitPrefix := strings.ToLower(matches[3])
if mul, ok := uMap[unitPrefix]; ok {
size *= float64(mul)
}
return int64(size), nil
}

123
vendor/github.com/docker/go-units/ulimit.go generated vendored Normal file
View file

@ -0,0 +1,123 @@
package units
import (
"fmt"
"strconv"
"strings"
)
// Ulimit is a human friendly version of Rlimit.
type Ulimit struct {
Name string
Hard int64
Soft int64
}
// Rlimit specifies the resource limits, such as max open files.
type Rlimit struct {
Type int `json:"type,omitempty"`
Hard uint64 `json:"hard,omitempty"`
Soft uint64 `json:"soft,omitempty"`
}
const (
// magic numbers for making the syscall
// some of these are defined in the syscall package, but not all.
// Also since Windows client doesn't get access to the syscall package, need to
// define these here
rlimitAs = 9
rlimitCore = 4
rlimitCPU = 0
rlimitData = 2
rlimitFsize = 1
rlimitLocks = 10
rlimitMemlock = 8
rlimitMsgqueue = 12
rlimitNice = 13
rlimitNofile = 7
rlimitNproc = 6
rlimitRss = 5
rlimitRtprio = 14
rlimitRttime = 15
rlimitSigpending = 11
rlimitStack = 3
)
var ulimitNameMapping = map[string]int{
//"as": rlimitAs, // Disabled since this doesn't seem usable with the way Docker inits a container.
"core": rlimitCore,
"cpu": rlimitCPU,
"data": rlimitData,
"fsize": rlimitFsize,
"locks": rlimitLocks,
"memlock": rlimitMemlock,
"msgqueue": rlimitMsgqueue,
"nice": rlimitNice,
"nofile": rlimitNofile,
"nproc": rlimitNproc,
"rss": rlimitRss,
"rtprio": rlimitRtprio,
"rttime": rlimitRttime,
"sigpending": rlimitSigpending,
"stack": rlimitStack,
}
// ParseUlimit parses and returns a Ulimit from the specified string.
func ParseUlimit(val string) (*Ulimit, error) {
parts := strings.SplitN(val, "=", 2)
if len(parts) != 2 {
return nil, fmt.Errorf("invalid ulimit argument: %s", val)
}
if _, exists := ulimitNameMapping[parts[0]]; !exists {
return nil, fmt.Errorf("invalid ulimit type: %s", parts[0])
}
var (
soft int64
hard = &soft // default to soft in case no hard was set
temp int64
err error
)
switch limitVals := strings.Split(parts[1], ":"); len(limitVals) {
case 2:
temp, err = strconv.ParseInt(limitVals[1], 10, 64)
if err != nil {
return nil, err
}
hard = &temp
fallthrough
case 1:
soft, err = strconv.ParseInt(limitVals[0], 10, 64)
if err != nil {
return nil, err
}
default:
return nil, fmt.Errorf("too many limit value arguments - %s, can only have up to two, `soft[:hard]`", parts[1])
}
if *hard != -1 {
if soft == -1 {
return nil, fmt.Errorf("ulimit soft limit must be less than or equal to hard limit: soft: -1 (unlimited), hard: %d", *hard)
}
if soft > *hard {
return nil, fmt.Errorf("ulimit soft limit must be less than or equal to hard limit: %d > %d", soft, *hard)
}
}
return &Ulimit{Name: parts[0], Soft: soft, Hard: *hard}, nil
}
// GetRlimit returns the RLimit corresponding to Ulimit.
func (u *Ulimit) GetRlimit() (*Rlimit, error) {
t, exists := ulimitNameMapping[u.Name]
if !exists {
return nil, fmt.Errorf("invalid ulimit name %s", u.Name)
}
return &Rlimit{Type: t, Soft: uint64(u.Soft), Hard: uint64(u.Hard)}, nil
}
func (u *Ulimit) String() string {
return fmt.Sprintf("%s=%d:%d", u.Name, u.Soft, u.Hard)
}

View file

@ -0,0 +1 @@
example/tracker-id.txt

22
vendor/github.com/jpillora/go-ogle-analytics/LICENSE generated vendored Normal file
View file

@ -0,0 +1,22 @@
MIT License
Copyright © 2015 dev@jpillora.com, Google Inc.
Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
'Software'), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to
the following conditions:
The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

81
vendor/github.com/jpillora/go-ogle-analytics/README.md generated vendored Normal file
View file

@ -0,0 +1,81 @@
## Go-ogle Analytics
Track and monitor your Go programs for free with Google Analytics
The `ga` package is essentially a Go wrapper around the [Google Analytics - Measurement Protocol](https://developers.google.com/analytics/devguides/collection/protocol/v1/reference)
**Warning** This package is 95% generated from the [Parameter Reference](https://developers.google.com/analytics/devguides/collection/protocol/v1/parameters) so it may contain bugs - please report them. GA allows "10 million hits per month per property" and will reject requests after that.
### Install
```
go get -v github.com/jpillora/go-ogle-analytics
```
### API
Create a new `client` and `Send()` a 'pageview', 'screenview', 'event', 'transaction', 'item', 'social', 'exception' or 'timing' event.
#### http://godoc.org/github.com/jpillora/go-ogle-analytics
### Quick Usage
1. Log into GA and create a new property and note its Tracker ID
1. Create a `ga-test.go` file
``` go
package main
import "github.com/jpillora/go-ogle-analytics"
func main() {
client, err := ga.NewClient("UA-XXXXXXXX-Y")
if err != nil {
panic(err)
}
err = client.Send(ga.NewEvent("Foo", "Bar").Label("Bazz"))
if err != nil {
panic(err)
}
println("Event fired!")
}
```
1. In GA, go to Real-time > Events
1. Run `ga-test.go`
```
$ go run ga-test.go
Event fired!
```
1. Watch as your event appears
![foo-ga](https://cloud.githubusercontent.com/assets/633843/5979585/023fc580-a8fd-11e4-803a-956610bcc2e2.png)
#### MIT License
Copyright © 2015 &lt;dev@jpillora.com&gt;
Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
'Software'), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to
the following conditions:
The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

76
vendor/github.com/jpillora/go-ogle-analytics/client.go generated vendored Normal file
View file

@ -0,0 +1,76 @@
//go:generate go run generate/protocol.go
package ga
import (
"bytes"
"fmt"
"net/http"
"net/url"
"regexp"
)
var trackingIDMatcher = regexp.MustCompile(`^UA-\d+-\d+$`)
func NewClient(trackingID string) (*Client, error) {
if !trackingIDMatcher.MatchString(trackingID) {
return nil, fmt.Errorf("Invalid Tracking ID: %s", trackingID)
}
return &Client{
UseTLS: true,
HttpClient: http.DefaultClient,
protocolVersion: "1",
protocolVersionSet: true,
trackingID: trackingID,
clientID: "go-ga",
clientIDSet: true,
}, nil
}
type hitType interface {
addFields(url.Values) error
}
func (c *Client) Send(h hitType) error {
cpy := c.Copy()
v := url.Values{}
cpy.setType(h)
err := cpy.addFields(v)
if err != nil {
return err
}
err = h.addFields(v)
if err != nil {
return err
}
url := ""
if cpy.UseTLS {
url = "https://www.google-analytics.com/collect"
} else {
url = "http://ssl.google-analytics.com/collect"
}
str := v.Encode()
buf := bytes.NewBufferString(str)
resp, err := c.HttpClient.Post(url, "application/x-www-form-urlencoded", buf)
if err != nil {
return err
}
defer resp.Body.Close()
if resp.StatusCode/100 != 2 {
return fmt.Errorf("Rejected by Google with code %d", resp.StatusCode)
}
// fmt.Printf("POST %s => %d\n", str, resp.StatusCode)
return nil
}

19
vendor/github.com/jpillora/go-ogle-analytics/conv.go generated vendored Normal file
View file

@ -0,0 +1,19 @@
package ga
import "fmt"
func bool2str(val bool) string {
if val {
return "1"
} else {
return "0"
}
}
func int2str(val int64) string {
return fmt.Sprintf("%d", val)
}
func float2str(val float64) string {
return fmt.Sprintf("%.6f", val)
}

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,58 @@
package ga
import "net/url"
//WARNING: This file was generated. Do not edit.
//Event Hit Type
type Event struct {
category string
action string
label string
labelSet bool
value int64
valueSet bool
}
// NewEvent creates a new Event Hit Type.
// Specifies the event category.
// Specifies the event action.
func NewEvent(category string, action string) *Event {
h := &Event{
category: category,
action: action,
}
return h
}
func (h *Event) addFields(v url.Values) error {
v.Add("ec", h.category)
v.Add("ea", h.action)
if h.labelSet {
v.Add("el", h.label)
}
if h.valueSet {
v.Add("ev", int2str(h.value))
}
return nil
}
// Specifies the event label.
func (h *Event) Label(label string) *Event {
h.label = label
h.labelSet = true
return h
}
// Specifies the event value. Values must be non-negative.
func (h *Event) Value(value int64) *Event {
h.value = value
h.valueSet = true
return h
}
func (h *Event) Copy() *Event {
c := *h
return &c
}

View file

@ -0,0 +1,49 @@
package ga
import "net/url"
//WARNING: This file was generated. Do not edit.
//Exception Hit Type
type Exception struct {
description string
descriptionSet bool
isExceptionFatal bool
isExceptionFatalSet bool
}
// NewException creates a new Exception Hit Type.
func NewException() *Exception {
h := &Exception{}
return h
}
func (h *Exception) addFields(v url.Values) error {
if h.descriptionSet {
v.Add("exd", h.description)
}
if h.isExceptionFatalSet {
v.Add("exf", bool2str(h.isExceptionFatal))
}
return nil
}
// Specifies the description of an exception.
func (h *Exception) Description(description string) *Exception {
h.description = description
h.descriptionSet = true
return h
}
// Specifies whether the exception was fatal.
func (h *Exception) IsExceptionFatal(isExceptionFatal bool) *Exception {
h.isExceptionFatal = isExceptionFatal
h.isExceptionFatalSet = true
return h
}
func (h *Exception) Copy() *Exception {
c := *h
return &c
}

View file

@ -0,0 +1,98 @@
package ga
import "net/url"
//WARNING: This file was generated. Do not edit.
//Item Hit Type
type Item struct {
iD string
name string
price float64
priceSet bool
quantity int64
quantitySet bool
code string
codeSet bool
category string
categorySet bool
currencyCode string
currencyCodeSet bool
}
// NewItem creates a new Item Hit Type.
// A unique identifier for the transaction. This value should
// be the same for both the Transaction hit and Items hits
// associated to the particular transaction.
// Specifies the item name.
func NewItem(iD string, name string) *Item {
h := &Item{
iD: iD,
name: name,
}
return h
}
func (h *Item) addFields(v url.Values) error {
v.Add("ti", h.iD)
v.Add("in", h.name)
if h.priceSet {
v.Add("ip", float2str(h.price))
}
if h.quantitySet {
v.Add("iq", int2str(h.quantity))
}
if h.codeSet {
v.Add("ic", h.code)
}
if h.categorySet {
v.Add("iv", h.category)
}
if h.currencyCodeSet {
v.Add("cu", h.currencyCode)
}
return nil
}
// Specifies the price for a single item / unit.
func (h *Item) Price(price float64) *Item {
h.price = price
h.priceSet = true
return h
}
// Specifies the number of items purchased.
func (h *Item) Quantity(quantity int64) *Item {
h.quantity = quantity
h.quantitySet = true
return h
}
// Specifies the SKU or item code.
func (h *Item) Code(code string) *Item {
h.code = code
h.codeSet = true
return h
}
// Specifies the category that the item belongs to.
func (h *Item) Category(category string) *Item {
h.category = category
h.categorySet = true
return h
}
// When present indicates the local currency for all transaction
// currency values. Value should be a valid ISO 4217 currency
// code.
func (h *Item) CurrencyCode(currencyCode string) *Item {
h.currencyCode = currencyCode
h.currencyCodeSet = true
return h
}
func (h *Item) Copy() *Item {
c := *h
return &c
}

View file

@ -0,0 +1,24 @@
package ga
import "net/url"
//WARNING: This file was generated. Do not edit.
//Pageview Hit Type
type Pageview struct {
}
// NewPageview creates a new Pageview Hit Type.
func NewPageview() *Pageview {
h := &Pageview{}
return h
}
func (h *Pageview) addFields(v url.Values) error {
return nil
}
func (h *Pageview) Copy() *Pageview {
c := *h
return &c
}

View file

@ -0,0 +1,24 @@
package ga
import "net/url"
//WARNING: This file was generated. Do not edit.
//Screenview Hit Type
type Screenview struct {
}
// NewScreenview creates a new Screenview Hit Type.
func NewScreenview() *Screenview {
h := &Screenview{}
return h
}
func (h *Screenview) addFields(v url.Values) error {
return nil
}
func (h *Screenview) Copy() *Screenview {
c := *h
return &c
}

View file

@ -0,0 +1,41 @@
package ga
import "net/url"
//WARNING: This file was generated. Do not edit.
//Social Hit Type
type Social struct {
network string
action string
actionTarget string
}
// NewSocial creates a new Social Hit Type.
// Specifies the social network, for example Facebook or Google
// Plus.
// Specifies the social interaction action. For example on
// Google Plus when a user clicks the +1 button, the social
// action is 'plus'.
// Specifies the target of a social interaction. This value
// is typically a URL but can be any text.
func NewSocial(network string, action string, actionTarget string) *Social {
h := &Social{
network: network,
action: action,
actionTarget: actionTarget,
}
return h
}
func (h *Social) addFields(v url.Values) error {
v.Add("sn", h.network)
v.Add("sa", h.action)
v.Add("st", h.actionTarget)
return nil
}
func (h *Social) Copy() *Social {
c := *h
return &c
}

View file

@ -0,0 +1,177 @@
package ga
import "net/url"
//WARNING: This file was generated. Do not edit.
//Timing Hit Type
type Timing struct {
userTimingCategory string
userTimingCategorySet bool
userTimingVariableName string
userTimingVariableNameSet bool
userTimingTime int64
userTimingTimeSet bool
userTimingLabel string
userTimingLabelSet bool
pageLoadTime int64
pageLoadTimeSet bool
dNSTime int64
dNSTimeSet bool
pageDownloadTime int64
pageDownloadTimeSet bool
redirectResponseTime int64
redirectResponseTimeSet bool
tCPConnectTime int64
tCPConnectTimeSet bool
serverResponseTime int64
serverResponseTimeSet bool
dOMInteractiveTime int64
dOMInteractiveTimeSet bool
contentLoadTime int64
contentLoadTimeSet bool
}
// NewTiming creates a new Timing Hit Type.
func NewTiming() *Timing {
h := &Timing{}
return h
}
func (h *Timing) addFields(v url.Values) error {
if h.userTimingCategorySet {
v.Add("utc", h.userTimingCategory)
}
if h.userTimingVariableNameSet {
v.Add("utv", h.userTimingVariableName)
}
if h.userTimingTimeSet {
v.Add("utt", int2str(h.userTimingTime))
}
if h.userTimingLabelSet {
v.Add("utl", h.userTimingLabel)
}
if h.pageLoadTimeSet {
v.Add("plt", int2str(h.pageLoadTime))
}
if h.dNSTimeSet {
v.Add("dns", int2str(h.dNSTime))
}
if h.pageDownloadTimeSet {
v.Add("pdt", int2str(h.pageDownloadTime))
}
if h.redirectResponseTimeSet {
v.Add("rrt", int2str(h.redirectResponseTime))
}
if h.tCPConnectTimeSet {
v.Add("tcp", int2str(h.tCPConnectTime))
}
if h.serverResponseTimeSet {
v.Add("srt", int2str(h.serverResponseTime))
}
if h.dOMInteractiveTimeSet {
v.Add("dit", int2str(h.dOMInteractiveTime))
}
if h.contentLoadTimeSet {
v.Add("clt", int2str(h.contentLoadTime))
}
return nil
}
// Specifies the user timing category.
func (h *Timing) UserTimingCategory(userTimingCategory string) *Timing {
h.userTimingCategory = userTimingCategory
h.userTimingCategorySet = true
return h
}
// Specifies the user timing variable.
func (h *Timing) UserTimingVariableName(userTimingVariableName string) *Timing {
h.userTimingVariableName = userTimingVariableName
h.userTimingVariableNameSet = true
return h
}
// Specifies the user timing value. The value is in milliseconds.
func (h *Timing) UserTimingTime(userTimingTime int64) *Timing {
h.userTimingTime = userTimingTime
h.userTimingTimeSet = true
return h
}
// Specifies the user timing label.
func (h *Timing) UserTimingLabel(userTimingLabel string) *Timing {
h.userTimingLabel = userTimingLabel
h.userTimingLabelSet = true
return h
}
// Specifies the time it took for a page to load. The value
// is in milliseconds.
func (h *Timing) PageLoadTime(pageLoadTime int64) *Timing {
h.pageLoadTime = pageLoadTime
h.pageLoadTimeSet = true
return h
}
// Specifies the time it took to do a DNS lookup.The value
// is in milliseconds.
func (h *Timing) DNSTime(dNSTime int64) *Timing {
h.dNSTime = dNSTime
h.dNSTimeSet = true
return h
}
// Specifies the time it took for the page to be downloaded.
// The value is in milliseconds.
func (h *Timing) PageDownloadTime(pageDownloadTime int64) *Timing {
h.pageDownloadTime = pageDownloadTime
h.pageDownloadTimeSet = true
return h
}
// Specifies the time it took for any redirects to happen.
// The value is in milliseconds.
func (h *Timing) RedirectResponseTime(redirectResponseTime int64) *Timing {
h.redirectResponseTime = redirectResponseTime
h.redirectResponseTimeSet = true
return h
}
// Specifies the time it took for a TCP connection to be made.
// The value is in milliseconds.
func (h *Timing) TCPConnectTime(tCPConnectTime int64) *Timing {
h.tCPConnectTime = tCPConnectTime
h.tCPConnectTimeSet = true
return h
}
// Specifies the time it took for the server to respond after
// the connect time. The value is in milliseconds.
func (h *Timing) ServerResponseTime(serverResponseTime int64) *Timing {
h.serverResponseTime = serverResponseTime
h.serverResponseTimeSet = true
return h
}
// Specifies the time it took for Document.readyState to be
// 'interactive'. The value is in milliseconds.
func (h *Timing) DOMInteractiveTime(dOMInteractiveTime int64) *Timing {
h.dOMInteractiveTime = dOMInteractiveTime
h.dOMInteractiveTimeSet = true
return h
}
// Specifies the time it took for the DOMContentLoaded Event
// to fire. The value is in milliseconds.
func (h *Timing) ContentLoadTime(contentLoadTime int64) *Timing {
h.contentLoadTime = contentLoadTime
h.contentLoadTimeSet = true
return h
}
func (h *Timing) Copy() *Timing {
c := *h
return &c
}

View file

@ -0,0 +1,95 @@
package ga
import "net/url"
//WARNING: This file was generated. Do not edit.
//Transaction Hit Type
type Transaction struct {
iD string
affiliation string
affiliationSet bool
revenue float64
revenueSet bool
shipping float64
shippingSet bool
tax float64
taxSet bool
currencyCode string
currencyCodeSet bool
}
// NewTransaction creates a new Transaction Hit Type.
// A unique identifier for the transaction. This value should
// be the same for both the Transaction hit and Items hits
// associated to the particular transaction.
func NewTransaction(iD string) *Transaction {
h := &Transaction{
iD: iD,
}
return h
}
func (h *Transaction) addFields(v url.Values) error {
v.Add("ti", h.iD)
if h.affiliationSet {
v.Add("ta", h.affiliation)
}
if h.revenueSet {
v.Add("tr", float2str(h.revenue))
}
if h.shippingSet {
v.Add("ts", float2str(h.shipping))
}
if h.taxSet {
v.Add("tt", float2str(h.tax))
}
if h.currencyCodeSet {
v.Add("cu", h.currencyCode)
}
return nil
}
// Specifies the affiliation or store name.
func (h *Transaction) Affiliation(affiliation string) *Transaction {
h.affiliation = affiliation
h.affiliationSet = true
return h
}
// Specifies the total revenue associated with the transaction.
// This value should include any shipping or tax costs.
func (h *Transaction) Revenue(revenue float64) *Transaction {
h.revenue = revenue
h.revenueSet = true
return h
}
// Specifies the total shipping cost of the transaction.
func (h *Transaction) Shipping(shipping float64) *Transaction {
h.shipping = shipping
h.shippingSet = true
return h
}
// Specifies the total tax of the transaction.
func (h *Transaction) Tax(tax float64) *Transaction {
h.tax = tax
h.taxSet = true
return h
}
// When present indicates the local currency for all transaction
// currency values. Value should be a valid ISO 4217 currency
// code.
func (h *Transaction) CurrencyCode(currencyCode string) *Transaction {
h.currencyCode = currencyCode
h.currencyCodeSet = true
return h
}
func (h *Transaction) Copy() *Transaction {
c := *h
return &c
}