mirror of
https://github.com/weaveworks/scope.git
synced 2026-03-03 10:11:03 +00:00
27
CHANGELOG.md
27
CHANGELOG.md
@@ -1,3 +1,30 @@
|
||||
## Release 0.8.0
|
||||
|
||||
New features:
|
||||
- Show message in the UI when topologies exceed size limits.
|
||||
[#474](https://github.com/weaveworks/scope/issues/474)
|
||||
- Provide container image information in detail pane for containers.
|
||||
[#398](https://github.com/weaveworks/scope/issues/398)
|
||||
- When filtering out system containers, also filter out pseudo nodes, if they were only connected to system containers.
|
||||
[#483](https://github.com/weaveworks/scope/issues/483)
|
||||
- Show number of filtered nodes in status pane.
|
||||
[#509](https://github.com/weaveworks/scope/issues/509)
|
||||
|
||||
Bug fixes:
|
||||
- Prevent detail pane from hiding nodes on click-to-focus.
|
||||
[#495](https://github.com/weaveworks/scope/issues/495)
|
||||
- Stop radial view from bouncing in some circumstances.
|
||||
[#496](https://github.com/weaveworks/scope/issues/496)
|
||||
- Make NAT tracking component more resilient to failure.
|
||||
[#506](https://github.com/weaveworks/scope/issues/506)
|
||||
- Prevent duplicate reports from reaching the same app.
|
||||
[#463](https://github.com/weaveworks/scope/issues/463)
|
||||
- Improve consistency of edge directionality in some use-cases.
|
||||
[#373](https://github.com/weaveworks/scope/issues/373)
|
||||
- Ensure probe, app, and container shut down cleanly.
|
||||
[#424](https://github.com/weaveworks/scope/issues/424)
|
||||
[#478](https://github.com/weaveworks/scope/issues/478)
|
||||
|
||||
## Release 0.7.0
|
||||
|
||||
New features:
|
||||
|
||||
7
Makefile
7
Makefile
@@ -94,10 +94,10 @@ frontend: $(SCOPE_UI_BUILD_UPTODATE)
|
||||
|
||||
clean:
|
||||
go clean ./...
|
||||
rm -rf $(SCOPE_EXPORT) $(SCOPE_UI_BUILD_EXPORT) $(APP_EXE) $(PROBE_EXE) client/build/app.js
|
||||
rm -rf $(SCOPE_EXPORT) $(SCOPE_UI_BUILD_EXPORT) $(APP_EXE) $(PROBE_EXE) client/build/app.js docker/weave
|
||||
|
||||
deps:
|
||||
go get -tags netgo \
|
||||
go get -u -f -tags netgo \
|
||||
github.com/jwilder/docker-squash \
|
||||
github.com/golang/lint/golint \
|
||||
github.com/fzipp/gocyclo \
|
||||
@@ -105,3 +105,6 @@ deps:
|
||||
github.com/mjibson/esc \
|
||||
github.com/kisielk/errcheck \
|
||||
github.com/aktau/github-release
|
||||
|
||||
update:
|
||||
go get -u -f -v -tags netgo ./...
|
||||
|
||||
@@ -140,11 +140,20 @@ var topologyRegistry = map[string]topologyView{
|
||||
human: "Applications",
|
||||
parent: "",
|
||||
renderer: render.FilterUnconnected(render.ProcessWithContainerNameRenderer),
|
||||
options: optionParams{"unconnected": {
|
||||
// Show the user why there are filtered nodes in this view.
|
||||
// Don't give them the option to show those nodes.
|
||||
{"hide", "Unconnected nodes hidden", true, nop},
|
||||
}},
|
||||
},
|
||||
"applications-by-name": {
|
||||
human: "by name",
|
||||
parent: "applications",
|
||||
renderer: render.FilterUnconnected(render.ProcessNameRenderer),
|
||||
options: optionParams{"unconnected": {
|
||||
// Ditto above.
|
||||
{"hide", "Unconnected nodes hidden", true, nop},
|
||||
}},
|
||||
},
|
||||
"containers": {
|
||||
human: "Containers",
|
||||
|
||||
9201
app/static.go
9201
app/static.go
File diff suppressed because it is too large
Load Diff
224
bin/release
224
bin/release
@@ -10,15 +10,53 @@ RELEASE_DESCRIPTION=${RELEASE_DESCRIPTION:-"Container Visibility"}
|
||||
|
||||
PWD=`pwd`
|
||||
|
||||
setup() {
|
||||
## Get the new version number from the most recent tag
|
||||
if ! LATEST_TAG=$(git describe --abbrev=0 --match='v*' 2>/dev/null) ; then
|
||||
echo "Could not find an annotated 'v*' version tag." >&2
|
||||
exit 1
|
||||
infer_release_type() {
|
||||
if echo $1 | grep -qE '^v[0-9]+\.[0-9]+\.0+$' ; then
|
||||
echo MAINLINE
|
||||
elif echo $1 | grep -qE '^v[0-9]+\.[0-9]+\.[0-9]+$' ; then
|
||||
echo BRANCH
|
||||
else
|
||||
echo PRERELEASE
|
||||
fi
|
||||
}
|
||||
|
||||
setup() {
|
||||
# Ensure we have exactly one annotated tag pointing at HEAD
|
||||
HEAD_TAGS=$(git tag --points-at HEAD)
|
||||
case $(echo $HEAD_TAGS | wc -w) in
|
||||
1)
|
||||
if [ $HEAD_TAGS != "latest_release" ] ; then
|
||||
LATEST_TAG=$HEAD_TAGS
|
||||
else
|
||||
echo "Cannot determine version - latest_release points at HEAD" >&2
|
||||
exit 1
|
||||
fi
|
||||
;;
|
||||
0)
|
||||
echo "Cannot determine version - no tags point at HEAD" >&2
|
||||
exit 1
|
||||
;;
|
||||
*)
|
||||
echo "Cannot determine version - multiple tags point at HEAD:" >&2
|
||||
for TAG in $HEAD_TAGS ; do
|
||||
echo -e "\t$TAG" >&2
|
||||
done
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
|
||||
RELEASE_TYPE=$(infer_release_type $LATEST_TAG)
|
||||
echo "== Inferred release type $RELEASE_TYPE from tag $LATEST_TAG"
|
||||
|
||||
LATEST_TAG_SHA=$(git rev-parse $LATEST_TAG)
|
||||
LATEST_TAG_COMMIT_SHA=$(git rev-list -1 $LATEST_TAG)
|
||||
LATEST_RELEASE_SHA=$(git rev-parse latest_release)
|
||||
VERSION=${LATEST_TAG#v}
|
||||
LATEST_RELEASE_COMMIT_SHA=$(git rev-list -1 latest_release)
|
||||
if [ "$RELEASE_TYPE" != 'PRERELEASE' ] ; then
|
||||
VERSION=${LATEST_TAG#v}
|
||||
else
|
||||
VERSION=${LATEST_TAG}
|
||||
fi
|
||||
# NB does not check that this tag is on master
|
||||
RELEASE_DIR=./releases/$LATEST_TAG
|
||||
}
|
||||
@@ -39,8 +77,8 @@ build() {
|
||||
cd $RELEASE_DIR
|
||||
|
||||
## Check that the top changelog entry is this version
|
||||
if ! latest_changelog=$(grep -o "## Release [0-9].*" -m1 ./CHANGELOG.md) || \
|
||||
! [ `echo "$latest_changelog" | grep -o '[0-9][^ ]*'` == "$VERSION" ]; then
|
||||
if ! latest_changelog=$(grep -oP '(?<=^## Release ).*' -m1 ./CHANGELOG.md) || \
|
||||
! [ `echo "$latest_changelog" = "$VERSION"` ]; then
|
||||
echo -e "\u2757 Latest changelog entry \"$latest_changelog\" does not match the release version $VERSION" >&2
|
||||
exit 1
|
||||
fi
|
||||
@@ -50,7 +88,7 @@ build() {
|
||||
|
||||
## Inject the version numbers and build the distributables
|
||||
## (library versions?)
|
||||
sed -i -e "s/^SCRIPT_VERSION=.*$/SCRIPT_VERSION=\"$VERSION\"/" ./scope
|
||||
sed -i "/SCRIPT_VERSION=/ c\SCRIPT_VERSION=\"$VERSION\"" ./scope
|
||||
make SUDO=$SUDO SCOPE_VERSION=$VERSION DOCKERHUB_USER=$DOCKERHUB_USER
|
||||
|
||||
if $(go list -e -f {{.Dir}} github.com/weaveworks/tools)/test; then
|
||||
@@ -71,24 +109,13 @@ build() {
|
||||
echo '** Release artefacts in' $RELEASE_DIR
|
||||
}
|
||||
|
||||
publish() {
|
||||
draft() {
|
||||
setup
|
||||
|
||||
cd $PWD/$RELEASE_DIR
|
||||
|
||||
echo "== Sanity checks"
|
||||
|
||||
if ! which github-release >/dev/null; then
|
||||
echo "Please install git-release:" >&2
|
||||
echo -e "\tgo get github.com/aktau/github-release" >&2
|
||||
echo "and create a git token per https://github.com/aktau/github-release" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if ! [ $(git rev-list -1 $LATEST_TAG) == $(git rev-list -1 latest_release) ]; then
|
||||
echo -e "\u2757 The tag latest_release does not point to the same commit as $LATEST_TAG"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
## Check that the tag exists by looking at github
|
||||
if ! curl -sSf https://api.github.com/repos/$GITHUB_USER/scope/git/tags/$LATEST_TAG_SHA >/dev/null 2>&1; then
|
||||
echo -e "\u2757 Tag $LATEST_TAG is not on GitHub, or is not the same as the local tag" >&2
|
||||
@@ -98,19 +125,9 @@ publish() {
|
||||
exit 1
|
||||
fi
|
||||
|
||||
## Check that the 'latest_release' tag exists by looking at github
|
||||
if ! curl -sSf https://api.github.com/repos/$GITHUB_USER/scope/git/tags/$LATEST_RELEASE_SHA >/dev/null 2>&1; then
|
||||
echo -e "\u2757 Tag latest_release is not on GitHub, or is not the same as the local tag" >&2
|
||||
echo -e "\thttps://github.com/$GITHUB_USER/scope/tags" >&2
|
||||
echo "You may need to" >&2
|
||||
echo -e "\tgit tag -af latest_release"
|
||||
echo -e "\tgit push -f git@github.com:$GITHUB_USER/scope latest_release"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo -e "\u2713 Tag $LATEST_TAG exists in GitHub repo $GITHUB_USER/scope"
|
||||
|
||||
## Check that the version doesn't already exist by looking at github
|
||||
## Check that the version does not already exist by looking at github
|
||||
## releases
|
||||
if github-release info --user $GITHUB_USER --repo scope --tag $LATEST_TAG >/dev/null 2>&1; then
|
||||
echo -e "\u2757 Release $LATEST_TAG already exists on GitHub" >&2
|
||||
@@ -120,14 +137,13 @@ publish() {
|
||||
|
||||
echo '** Sanity checks OK for publishing tag' $LATEST_TAG as $DOCKERHUB_USER/scope:$VERSION
|
||||
|
||||
echo "== Tagging and publishing images on docker hub as user $DOCKERHUB_USER"
|
||||
$SUDO docker tag -f $DOCKERHUB_USER/scope $DOCKERHUB_USER/scope:$VERSION
|
||||
$SUDO docker push $DOCKERHUB_USER/scope:$VERSION
|
||||
RELEASE_ARGS="--draft"
|
||||
if [ "$RELEASE_TYPE" = 'PRERELEASE' ] ; then
|
||||
RELEASE_ARGS="$RELEASE_ARGS --pre-release"
|
||||
fi
|
||||
|
||||
echo "== Creating GitHub release $RELEASE_NAME $VERSION"
|
||||
# This cannot be done as a draft because of a bug in
|
||||
# github-release: https://github.com/aktau/github-release/issues/7
|
||||
github-release release \
|
||||
echo "== Creating GitHub release $RELEASE_ARGS $RELEASE_NAME $VERSION"
|
||||
github-release release $RELEASE_ARGS \
|
||||
--user $GITHUB_USER \
|
||||
--repo scope \
|
||||
--tag $LATEST_TAG \
|
||||
@@ -141,52 +157,128 @@ publish() {
|
||||
--name "scope" \
|
||||
--file "./scope"
|
||||
|
||||
echo "** Published release $RELEASE_NAME $VERSION"
|
||||
echo "** Draft $TYPE $RELEASE_NAME $VERSION created at"
|
||||
echo -e "\thttps://github.com/$GITHUB_USER/scope/releases/$LATEST_TAG"
|
||||
}
|
||||
|
||||
if github-release info --user $GITHUB_USER --repo scope \
|
||||
--tag latest_release >/dev/null 2>&1; then
|
||||
github-release delete \
|
||||
--user $GITHUB_USER \
|
||||
--repo scope \
|
||||
--tag latest_release
|
||||
publish() {
|
||||
setup
|
||||
cd $PWD/$RELEASE_DIR
|
||||
|
||||
UPDATE_LATEST=false
|
||||
if [ "$RELEASE_TYPE" = 'MAINLINE' ] ; then
|
||||
UPDATE_LATEST=true
|
||||
fi
|
||||
|
||||
github-release release \
|
||||
--user $GITHUB_USER \
|
||||
--repo scope \
|
||||
--tag latest_release \
|
||||
--name "$RELEASE_NAME latest ($VERSION)" \
|
||||
--description "$RELEASE_DESCRIPTION"
|
||||
if [ "$RELEASE_TYPE" = 'PRERELEASE' ] ; then
|
||||
echo "== Tagging and pushing images on docker hub as user $DOCKERHUB_USER"
|
||||
$SUDO docker tag -f $DOCKERHUB_USER/scope $DOCKERHUB_USER/scope:$VERSION
|
||||
$SUDO docker push $DOCKERHUB_USER/scope:$VERSION
|
||||
echo "** Docker images tagged and pushed"
|
||||
|
||||
github-release upload \
|
||||
--user $GITHUB_USER \
|
||||
--repo scope \
|
||||
--tag latest_release \
|
||||
--name "scope" \
|
||||
--file "./scope"
|
||||
echo "== Publishing pre-release on GitHub"
|
||||
|
||||
echo "** Published $RELEASE_NAME as latest_release at"
|
||||
echo -e "\thttps://github.com/$GITHUB_USER/scope/releases/latest_release"
|
||||
github-release publish \
|
||||
--user $GITHUB_USER \
|
||||
--repo scope \
|
||||
--tag $LATEST_TAG
|
||||
|
||||
echo "** Pre-release $RELEASE_NAME $VERSION published at"
|
||||
echo -e "\thttps://github.com/$GITHUB_USER/scope/releases/$LATEST_TAG"
|
||||
else
|
||||
echo "== Sanity checks"
|
||||
if ! [ "$LATEST_TAG_COMMIT_SHA" == "$LATEST_RELEASE_COMMIT_SHA" ] ; then
|
||||
echo -e "\u2757 The tag latest_release does not point to the same commit as $LATEST_TAG" >&2
|
||||
echo "You may need to" >&2
|
||||
echo -e "\tgit tag -af latest_release $LATEST_TAG" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
## Check that the 'latest_release' tag exists by looking at github
|
||||
if ! curl -sSf https://api.github.com/repos/$GITHUB_USER/scope/git/tags/$LATEST_RELEASE_SHA >/dev/null 2>&1; then
|
||||
echo -e "\u2757 Tag latest_release is not on GitHub, or is not the same as the local tag" >&2
|
||||
echo -e "\thttps://github.com/$GITHUB_USER/scope/tags" >&2
|
||||
echo "You may need to" >&2
|
||||
echo -e "\tgit push -f git@github.com:$GITHUB_USER/scope latest_release" >&2
|
||||
exit 1
|
||||
fi
|
||||
echo '** Sanity checks OK for publishing tag' $LATEST_TAG as $DOCKERHUB_USER/scope:$VERSION
|
||||
|
||||
echo "== Tagging and pushing images on docker hub as user $DOCKERHUB_USER"
|
||||
$SUDO docker tag -f $DOCKERHUB_USER/scope $DOCKERHUB_USER/scope:$VERSION
|
||||
$SUDO docker push $DOCKERHUB_USER/scope:$VERSION
|
||||
echo "** Docker images tagged and pushed"
|
||||
|
||||
echo "== Publishing release on GitHub"
|
||||
|
||||
github-release publish \
|
||||
--user $GITHUB_USER \
|
||||
--repo scope \
|
||||
--tag $LATEST_TAG
|
||||
|
||||
if github-release info --user $GITHUB_USER --repo scope \
|
||||
--tag latest_release >/dev/null 2>&1; then
|
||||
github-release delete \
|
||||
--user $GITHUB_USER \
|
||||
--repo scope \
|
||||
--tag latest_release
|
||||
fi
|
||||
|
||||
github-release release \
|
||||
--user $GITHUB_USER \
|
||||
--repo scope \
|
||||
--tag latest_release \
|
||||
--name "$RELEASE_NAME latest ($VERSION)" \
|
||||
--description "[Release Notes](https://github.com/$GITHUB_USER/scope/releases/$LATEST_TAG)"
|
||||
|
||||
github-release upload \
|
||||
--user $GITHUB_USER \
|
||||
--repo scope \
|
||||
--tag latest_release \
|
||||
--name "scope" \
|
||||
--file "./scope"
|
||||
|
||||
echo "** Release $RELEASE_NAME $VERSION published at"
|
||||
echo -e "\thttps://github.com/$GITHUB_USER/scope/releases/$LATEST_TAG"
|
||||
echo -e "\thttps://github.com/$GITHUB_USER/scope/releases/latest_release"
|
||||
fi
|
||||
}
|
||||
|
||||
usage() {
|
||||
echo "Usage:"
|
||||
echo -e "\t./bin/release build"
|
||||
echo "-- Build artefacts for the latest version tag"
|
||||
echo -e "\t./bin/release draft"
|
||||
echo "-- Create draft release with artefacts in GitHub"
|
||||
echo -e "\t./bin/release publish"
|
||||
echo "-- Publish the artefacts for the latest tag to GitHub and DockerHub"
|
||||
echo "-- Publish the GitHub release and update DockerHub"
|
||||
exit 1
|
||||
}
|
||||
|
||||
case "$1" in
|
||||
# Ensure required tooling is installed
|
||||
if ! which github-release >/dev/null; then
|
||||
echo "Please install git-release:" >&2
|
||||
echo -e "\tgo get github.com/weaveworks/github-release" >&2
|
||||
echo "and create a git token per https://github.com/weaveworks/github-release" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
[ $# -eq 0 ] && usage
|
||||
COMMAND=$1
|
||||
shift
|
||||
|
||||
case "$COMMAND" in
|
||||
build)
|
||||
build
|
||||
build "$@"
|
||||
;;
|
||||
draft)
|
||||
draft "$@"
|
||||
;;
|
||||
publish)
|
||||
publish
|
||||
publish "$@"
|
||||
;;
|
||||
*)
|
||||
echo "Unknown command \"$1\""
|
||||
echo "Unknown command \"$COMMAND\""
|
||||
usage
|
||||
;;
|
||||
esac
|
||||
|
||||
@@ -10,6 +10,7 @@ import (
|
||||
"os"
|
||||
"os/signal"
|
||||
"strings"
|
||||
"sync"
|
||||
"syscall"
|
||||
"time"
|
||||
|
||||
@@ -153,27 +154,20 @@ func main() {
|
||||
}()
|
||||
}
|
||||
|
||||
quit, done := make(chan struct{}), make(chan struct{})
|
||||
defer func() { <-done }() // second, wait for the main loop to be killed
|
||||
defer close(quit) // first, kill the main loop
|
||||
quit, done := make(chan struct{}), sync.WaitGroup{}
|
||||
done.Add(2)
|
||||
defer func() { done.Wait() }() // second, wait for the main loops to be killed
|
||||
defer close(quit) // first, kill the main loops
|
||||
|
||||
var rpt syncReport
|
||||
rpt.swap(report.MakeReport())
|
||||
|
||||
go func() {
|
||||
defer close(done)
|
||||
var (
|
||||
pubTick = time.Tick(*publishInterval)
|
||||
spyTick = time.Tick(*spyInterval)
|
||||
r = report.MakeReport()
|
||||
p = xfer.NewReportPublisher(publishers)
|
||||
)
|
||||
defer done.Done()
|
||||
spyTick := time.Tick(*spyInterval)
|
||||
|
||||
for {
|
||||
select {
|
||||
case <-pubTick:
|
||||
publishTicks.WithLabelValues().Add(1)
|
||||
r.Window = *publishInterval
|
||||
if err := p.Publish(r); err != nil {
|
||||
log.Printf("publish: %v", err)
|
||||
}
|
||||
r = report.MakeReport()
|
||||
|
||||
case <-spyTick:
|
||||
start := time.Now()
|
||||
for _, ticker := range tickers {
|
||||
@@ -181,8 +175,12 @@ func main() {
|
||||
log.Printf("error doing ticker: %v", err)
|
||||
}
|
||||
}
|
||||
r = r.Merge(doReport(reporters))
|
||||
r = Apply(r, taggers)
|
||||
|
||||
localReport := rpt.copy()
|
||||
localReport = localReport.Merge(doReport(reporters))
|
||||
localReport = Apply(localReport, taggers)
|
||||
rpt.swap(localReport)
|
||||
|
||||
if took := time.Since(start); took > *spyInterval {
|
||||
log.Printf("report generation took too long (%s)", took)
|
||||
}
|
||||
@@ -193,6 +191,29 @@ func main() {
|
||||
}
|
||||
}()
|
||||
|
||||
go func() {
|
||||
defer done.Done()
|
||||
var (
|
||||
pubTick = time.Tick(*publishInterval)
|
||||
p = xfer.NewReportPublisher(publishers)
|
||||
)
|
||||
|
||||
for {
|
||||
select {
|
||||
case <-pubTick:
|
||||
publishTicks.WithLabelValues().Add(1)
|
||||
localReport := rpt.swap(report.MakeReport())
|
||||
localReport.Window = *publishInterval
|
||||
if err := p.Publish(localReport); err != nil {
|
||||
log.Printf("publish: %v", err)
|
||||
}
|
||||
|
||||
case <-quit:
|
||||
return
|
||||
}
|
||||
}
|
||||
}()
|
||||
|
||||
log.Printf("%s", <-interrupt())
|
||||
}
|
||||
|
||||
@@ -221,3 +242,22 @@ func interrupt() <-chan os.Signal {
|
||||
signal.Notify(c, syscall.SIGINT, syscall.SIGTERM)
|
||||
return c
|
||||
}
|
||||
|
||||
type syncReport struct {
|
||||
mtx sync.RWMutex
|
||||
rpt report.Report
|
||||
}
|
||||
|
||||
func (r *syncReport) swap(other report.Report) report.Report {
|
||||
r.mtx.Lock()
|
||||
defer r.mtx.Unlock()
|
||||
old := r.rpt
|
||||
r.rpt = other
|
||||
return old
|
||||
}
|
||||
|
||||
func (r *syncReport) copy() report.Report {
|
||||
r.mtx.RLock()
|
||||
defer r.mtx.RUnlock()
|
||||
return r.rpt.Copy()
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user